多轮审查和修复

This commit is contained in:
2026-05-12 15:34:08 +08:00
parent f55d2a57c3
commit ebbbb7332e
805 changed files with 838724 additions and 1905 deletions

View File

@@ -0,0 +1,85 @@
using System;
using System.Collections.Generic;
using UnityEngine;
using BaseGames.Player;
namespace BaseGames.VFX
{
/// <summary>
/// 形态切换时替换玩家精灵调色板。
/// 通过 Texture2D 查找表LUTShader 实现,不换 Sprite 资产。
/// 挂在玩家 SpriteRenderer 所在 GameObject 上。
/// 由 FormController 在切换形态时调用 ApplyPalette(FormType)。
/// </summary>
public class PaletteSwapSystem : MonoBehaviour
{
[SerializeField] private SpriteRenderer _renderer;
[SerializeField] private PaletteCatalogSO _catalog;
private static readonly int PaletteTexID = Shader.PropertyToID("_PaletteTex");
private MaterialPropertyBlock _block;
private void Awake()
{
if (_renderer == null)
_renderer = GetComponent<SpriteRenderer>();
Debug.Assert(_catalog != null, "[PaletteSwapSystem] _catalog 未赋值,请在 Inspector 中指定 PaletteCatalogSO。", this);
_block = new MaterialPropertyBlock();
}
/// <summary>
/// 切换到指定形态的调色板。由 FormController.SwitchForm() 调用。
/// 要求 SpriteRenderer 所用 Shader 支持 _PaletteTexTexture属性。
/// </summary>
public void ApplyPalette(FormType form)
{
if (_renderer == null) return;
if (!_catalog.TryGetPalette(form, out var tex)) return;
_renderer.GetPropertyBlock(_block);
_block.SetTexture(PaletteTexID, tex);
_renderer.SetPropertyBlock(_block);
}
}
// ────────────────────────────────────────────────────────────────────────────
// PaletteCatalogSO
// ────────────────────────────────────────────────────────────────────────────
/// <summary>
/// 形态 → 调色板 LUT1D Texture2D256×1 px映射表。
/// 资产路径Assets/ScriptableObjects/VFX/VFX_PaletteCatalog.asset
/// </summary>
[CreateAssetMenu(menuName = "VFX/PaletteCatalog")]
public class PaletteCatalogSO : ScriptableObject
{
[SerializeField] private PaletteEntry[] _entries;
/// <summary>懒初始化字典缓存,将 O(n) 线性查找降为 O(1)。</summary>
private Dictionary<FormType, Texture2D> _cache;
/// <summary>根据形态类型查找对应的调色板 LUT 纹理。</summary>
public bool TryGetPalette(FormType form, out Texture2D tex)
{
if (_cache == null)
{
_cache = new Dictionary<FormType, Texture2D>(_entries?.Length ?? 0);
if (_entries != null)
foreach (var e in _entries)
_cache[e.form] = e.paletteLUT;
}
return _cache.TryGetValue(form, out tex);
}
private void OnValidate() => _cache = null; // 编辑器更改 _entries 后重建缓存
}
/// <summary>单条形态 → LUT 映射数据。</summary>
[Serializable]
public struct PaletteEntry
{
public FormType form;
public Texture2D paletteLUT; // 1D 查找表纹理256×1 px
}
}