Тест 10.10: останки в игре бледно-бежевые, хотя в Unity тот же префаб тёмный - игра рисует копию Standard из бандла иначе (как было у крысы). BundleShaderFix ставит встроенный Standard останкам, черепу и ножу-мечу (очередь сохраняется). Плёнка краснее (указание: «больше красного на не-кости»), модель x1.2, иконка перерисована. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
90 lines
3.1 KiB
C#
90 lines
3.1 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
}
|