Storyline+Dialog初步

This commit is contained in:
SoulliesOfficial
2026-07-05 16:08:23 -04:00
parent afa8a56e1d
commit d031afd075
464 changed files with 25716 additions and 4209 deletions

View File

@@ -0,0 +1,52 @@
using System.Collections.Generic;
using Sirenix.OdinInspector;
using UnityEngine;
namespace Ichni.Story
{
/// <summary>
/// 立绘渲染方式。当前使用 Sprite预留 Live2D / Spine 扩展入口。
/// </summary>
public enum PortraitStyle
{
Sprite,
Live2D,
Spine
}
/// <summary>
/// 单个角色的立绘数据(按角色单独创建 ScriptableObject 资产)。
/// </summary>
[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 / angryValue 为对应 Sprite 资产。")]
public Dictionary<string, Sprite> emotionSprites = new Dictionary<string, Sprite>();
// ── 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;
}
}