TH1/Unity/Assets/Scripts/TH1_DataAssetsScript/VisualSpriteVariantMapAsset.cs
2026-06-05 00:49:32 +08:00

79 lines
1.7 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
public enum VisualTheme
{
Default,
EyeComfort
}
[Serializable]
public class VisualSpriteVariantPair
{
public string Group;
public Sprite Source;
public Sprite EyeComfort;
}
[CreateAssetMenu(fileName = "VisualSpriteVariantMap", menuName = "TH1 Game Data/Visual Sprite Variant Map")]
public class VisualSpriteVariantMapAsset : ScriptableObject
{
public List<VisualSpriteVariantPair> Pairs = new();
[NonSerialized] private Dictionary<Sprite, Sprite> _eyeComfortDict;
public Sprite Resolve(Sprite source, VisualTheme theme)
{
if (source == null || theme == VisualTheme.Default)
return source;
BuildDictIfNeeded();
return _eyeComfortDict.TryGetValue(source, out var replacement) && replacement != null
? replacement
: source;
}
public int CountMappedPairs(VisualTheme theme)
{
if (theme == VisualTheme.Default)
return 0;
int count = 0;
foreach (var pair in Pairs)
{
if (pair?.Source != null && pair.EyeComfort != null)
count++;
}
return count;
}
public void RebuildCache()
{
_eyeComfortDict = null;
BuildDictIfNeeded();
}
private void BuildDictIfNeeded()
{
if (_eyeComfortDict != null)
return;
_eyeComfortDict = new Dictionary<Sprite, Sprite>();
foreach (var pair in Pairs)
{
if (pair?.Source == null || pair.EyeComfort == null)
continue;
_eyeComfortDict[pair.Source] = pair.EyeComfort;
}
}
private void OnValidate()
{
_eyeComfortDict = null;
}
}