Останки: встроенный шейдер вместо бандлового, краснее, x1.2

Тест 10.10: останки в игре бледно-бежевые, хотя в Unity тот же префаб тёмный -
игра рисует копию Standard из бандла иначе (как было у крысы). BundleShaderFix
ставит встроенный Standard останкам, черепу и ножу-мечу (очередь сохраняется).
Плёнка краснее (указание: «больше красного на не-кости»), модель x1.2,
иконка перерисована.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
AlexCube
2026-10-10 21:34:29 +03:00
co-authored by Claude Opus 5.5
parent f0b326b7e5
commit 6028252cd6
6 changed files with 90 additions and 1 deletions
+89
View File
@@ -0,0 +1,89 @@
using System.Collections.Generic;
using HarmonyLib;
using UnityEngine;
namespace NecromancerTome
{
/// <summary>
/// Шейдер Standard из наших бандлов (10.10.2026). Тест в игре: останки красного трупа вышли бледно-бежевыми, хотя
/// в Unity тот же префаб тёмный и багровый (снимок NecroPreviewOne) - игра рисует копию Standard, приехавшую
/// в бандле, не так, как свой Standard. То же раньше было у крысы (RatModel.cs подменяет шейдер на свой) и у
/// пирамиды (маджента издалека). Здесь - общая подмена для новых моделей: останки (сущность necroRemains),
/// череп и нож-меч прилива (модели предметов). Материалы бандла общие - правится один раз на материал.
/// Очередь отрисовки сохраняется (у меча прилива - прозрачная, Fade).
/// </summary>
public static class BundleShaderFix
{
static Shader _std;
static readonly HashSet<int> _done = new HashSet<int>();
public static void Fix(Transform _root)
{
if (_root == null)
{
return;
}
if (_std == null)
{
_std = Shader.Find("Standard");
if (_std == null)
{
return;
}
}
foreach (Renderer r in _root.GetComponentsInChildren<Renderer>(true))
{
foreach (Material m in r.sharedMaterials)
{
if (m == null || m.shader == null || m.shader == _std || m.shader.name != "Standard" || !_done.Add(m.GetInstanceID()))
{
continue;
}
int queue = m.renderQueue;
m.shader = _std;
m.renderQueue = queue;
Debug.Log("[NecromancerTome] BundleShaderFix: материал '" + m.name + "' - встроенный Standard (очередь " + queue + ")");
}
}
}
}
/// <summary>Останки красного трупа - модель сущности.</summary>
[HarmonyPatch(typeof(EModelBase), nameof(EModelBase.createModel))]
public static class Patch_EModelBase_createModel_BundleShaderFix
{
static int _cls = int.MinValue;
public static void Postfix(EModelBase __instance)
{
if (_cls == int.MinValue)
{
_cls = EntityClass.FromString(RemainsDecay.EntityClassName);
}
Entity e = __instance.entity;
if (e != null && e.entityClass == _cls)
{
BundleShaderFix.Fix(__instance.GetModelTransform());
}
}
}
/// <summary>Череп и нож (меч прилива) - модели предметов: в руке и на земле.</summary>
[HarmonyPatch(typeof(ItemClass), nameof(ItemClass.CloneModel))]
public static class Patch_ItemClass_CloneModel_BundleShaderFix
{
public static void Postfix(ItemClass __instance, AssetManagement.InstanceHandle<GameObject> __result)
{
string n = __instance?.Name;
if (n != "necroSkull" && n != SnakeMode.KnifeName)
{
return;
}
GameObject go = __result.Instance;
if (go != null)
{
BundleShaderFix.Fix(go.transform);
}
}
}
}
+1 -1
View File
@@ -141,7 +141,7 @@ namespace NecromancerTome
} }
// центр модели останков сдвинут от таза к груди: отодвинуть назад на полкорпуса, чтобы таз остался на месте // центр модели останков сдвинут от таза к груди: отодвинуть назад на полкорпуса, чтобы таз остался на месте
Vector3 back = Quaternion.Euler(0f, yaw, 0f) * Vector3.back; Vector3 back = Quaternion.Euler(0f, yaw, 0f) * Vector3.back;
g += back * 0.16f; g += back * 0.19f; // модель x1.2 (NecroRemainsSetup.Scale)
if (!(EntityFactory.CreateEntity(cls, g, new Vector3(0f, yaw, 0f)) is EntityLootContainer rem)) if (!(EntityFactory.CreateEntity(cls, g, new Vector3(0f, yaw, 0f)) is EntityLootContainer rem))
{ {
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

Before

Width:  |  Height:  |  Size: 20 KiB

After

Width:  |  Height:  |  Size: 21 KiB