using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; namespace Ichni.Story { /// /// 全局角色注册表(ScriptableObject)。 /// 按 characterId 索引所有 , /// 运行时提供带缓存的快速查找。 /// [CreateAssetMenu(fileName = "CharacterRegistry", menuName = "Ichni/Story/New/CharacterRegistry")] public class CharacterRegistry : SerializedScriptableObject { [LabelText("Characters")] [ListDrawerSettings(ShowFoldout = true, DraggableItems = true)] [InfoBox("将所有角色的 CharacterData 资产拖入此列表,系统运行时会自动按 characterId 建立索引。")] public List characters = new List(); // 运行时缓存,首次 TryGet 时延迟构建 private Dictionary _cache; /// /// 根据 characterId 查找角色数据,找到时返回 true 并通过 out 输出结果。 /// public bool TryGet(string characterId, out CharacterData data) { if (_cache == null) BuildCache(); return _cache.TryGetValue(characterId, out data); } /// /// 根据 characterId 获取角色数据,未找到时返回 null。 /// public CharacterData Get(string characterId) { TryGet(characterId, out CharacterData data); return data; } private void BuildCache() { _cache = new Dictionary(characters.Count); foreach (CharacterData character in characters) { if (character == null) continue; if (!string.IsNullOrEmpty(character.characterId)) _cache[character.characterId] = character; } } private void OnValidate() { // Inspector 中修改列表时清除缓存,确保 TryGet 结果始终一致 _cache = null; } } }