using System; using System.Collections; using System.Collections.Generic; using Ichni.RhythmGame.Beatmap; using Sirenix.OdinInspector; using UnityEngine; namespace Ichni.RhythmGame { public abstract partial class GameElement : SerializedMonoBehaviour, IBaseElement { //物体名 public string elementName; //标识 GUID public Guid elementGuid; //标签 public List tags; //父游戏物体 public GameElement parentElement; //子物体列表 public List childElementList = new List(); //次级模块 public List submoduleList = new List(); //存档类 public BaseElement_BM matchedBM { get; set; } /// /// 首次初始化 /// /// 物体名 public virtual void Initialize(string name, Guid elementGuid, List tags, bool isFirstGenerated) { this.elementName = name; this.elementGuid = elementGuid; this.tags = tags; EditorManager.instance.beatmapContainer.gameElementList.Add(this); submoduleList = new List(); if (isFirstGenerated) { SetDefaultSubmodules(); } //GameManager.beatMapContainer.beatMapElementList.Add(this); //serialNumber = totalSerialNumber++; //SetTransformObserver(); } /// /// 设置次级模块 /// protected abstract void SetDefaultSubmodules(); /// /// 在所有物体生成完毕后,执行的初始化方法 /// public virtual void AfterInitialize() { } /// /// 刷新物体的状态 /// public virtual void Refresh() { } /// /// 设置父物体 /// /// 父物体 public void SetParent(GameElement parentElement) { if (parentElement != null) { parentElement.childElementList.Add(this); this.parentElement = parentElement; transform.SetParent(parentElement.transform); } } } public abstract partial class GameElement //存档,删除,复制,粘贴 { /// /// 用于生成存档 /// public virtual void SaveBM() { throw new NotImplementedException(); } /// /// 当物体被删除时执行的方法 /// public virtual void OnDelete() { throw new NotImplementedException(); } /// /// 删除物体,包括所有子物体 /// public virtual void Delete() { if (this.childElementList != null) { for (int i = 0; i < childElementList.Count; i++) { childElementList[i].Delete(); //删除子GameElement、 } } OnDelete(); #if UNITY_EDITOR Debug.Log("Delete " + elementName + "(" + elementGuid + ")"); #endif EditorManager.instance.beatmapContainer.gameElementList.Remove(this); //从保存列表中剔除 this.parentElement.childElementList.Remove(this); Destroy(gameObject); //销毁 } } namespace Beatmap { [System.Serializable] public abstract class GameElement_BM : BaseElement_BM { [System.NonSerialized] public static Dictionary identifier = new(); //存档类的标识符 [System.NonSerialized] public GameElement matchedElement; //存档类对应的游戏物体 public string elementName; public List tags; public Guid elementGuid; public Guid attachedElementGuid; public GameElement_BM() { } public GameElement_BM(string elementName, Guid elementGuid, List tags, GameElement_BM attachedElement) { this.elementName = elementName; this.elementGuid = elementGuid; this.tags = tags; this.attachedElementGuid = attachedElement?.elementGuid ?? Guid.Empty; identifier.TryAdd(this.elementGuid, this); } public static GameElement_BM GetElementBM(Guid id) { if (identifier.TryGetValue(id, out GameElement_BM element_BM)) { return element_BM; } return null; } public static GameElement GetElement(Guid id) { if(identifier.TryGetValue(id, out GameElement_BM element_BM)) { return element_BM.matchedElement; } return null; } /// /// 复制物体 /// /// (对于物体)父物体,(对于次级模块)或挂载物体 public abstract GameElement DuplicateBM(GameElement attached); } } }