using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.Serialization; namespace Ichni.Story { [CreateAssetMenu(fileName = "StoryData", menuName = "Ichni/Story/StoryData")] public class StoryData : SerializedScriptableObject { public List dialogBlockDatas; // 剧情单元格名称列表 public List songBlockDatas; // 音乐单元格名称列表 public List tutorialBlockDatas; // 教程单元格名称列表 public List initialBlocks; // 初始剧情单元格列表,包含所有初始剧情单元格的名称 public StoryBlockData GetDataByName(string blockName, out Type dataType) { foreach (var block in tutorialBlockDatas.Where(block => block.blockName == blockName)) { dataType = typeof(TutorialBlockData); return block; } foreach (var block in songBlockDatas.Where(block => block.blockName == blockName)) { dataType = typeof(SongBlockData); return block; } foreach (var block in dialogBlockDatas.Where(block => block.blockName == blockName)) { dataType = typeof(DialogBlockData); return block; } throw new ArgumentException($"No block found with name: {blockName}"); } } [InlineProperty] [Serializable] public class InitialBlockData { public string blockName; public StoryBlockState initialState; // 初始状态 public Vector2 blockPosition; // 初始位置 public List nextBlocks; // 下一步可选的剧情单元格名称列表 } [InlineProperty] [Serializable] public class StoryBlockData { [FoldoutGroup("$blockName", true)] public string blockName; [FoldoutGroup("$blockName")] public string blockID; [FoldoutGroup("$blockName")] public Vector2 blockSize; } [InlineProperty] [Serializable] public class TutorialBlockData : StoryBlockData { [FoldoutGroup("$blockName")] public string tutorialName; public TutorialBlockData() { this.blockSize = new Vector2(400, 200); } } [InlineProperty] [Serializable] public class DialogBlockData : StoryBlockData { [FoldoutGroup("$blockName")] public string dialogTitle; public DialogBlockData() { this.blockSize = new Vector2(400, 200); } } [InlineProperty] [Serializable] public class SongBlockData : StoryBlockData { [FoldoutGroup("$blockName")] public string songName; public SongBlockData() { this.blockSize = new Vector2(400, 200); } } }