using System.Collections.Generic; using Sirenix.OdinInspector; using UnityEngine; namespace Ichni.Story { /// /// 立绘渲染方式。当前使用 Sprite,预留 Live2D / Spine 扩展入口。 /// public enum PortraitStyle { Sprite, Live2D, Spine } /// /// 单个角色的立绘数据(按角色单独创建 ScriptableObject 资产)。 /// [CreateAssetMenu(fileName = "CharacterData", menuName = "Ichni/Story/New/CharacterData")] public class CharacterData : SerializedScriptableObject { [LabelText("Character ID")] [InfoBox("此 ID 需与 .yarn 文件中对应台词的 speaker 名完全一致。")] public string characterId; [LabelText("Display Name Key")] [InfoBox("Unity Localization String Table Key,用于多语言角色名显示。")] public string displayNameKey; [LabelText("Portrait Style")] public PortraitStyle portraitStyle = PortraitStyle.Sprite; // ── Sprite ────────────────────────────────────────────────────────────── [LabelText("Emotion Sprites")] [ShowIf("portraitStyle", PortraitStyle.Sprite)] [DictionaryDrawerSettings(KeyLabel = "Emotion Name", ValueLabel = "Sprite")] [InfoBox("Key 为情绪名(如 normal / happy / angry),Value 为对应 Sprite 资产。")] public Dictionary emotionSprites = new Dictionary(); // ── Dynamic (Live2D / Spine) ───────────────────────────────────────────── [LabelText("Dynamic Portrait Prefab")] [ShowIf("IsDynamicPortrait")] [InfoBox("Live2D / Spine 立绘预制体,需挂载实现 IPortraitRenderer 接口的组件(阶段 3 制作)。")] public GameObject dynamicPortraitPrefab; private bool IsDynamicPortrait => portraitStyle == PortraitStyle.Live2D || portraitStyle == PortraitStyle.Spine; } }