227 lines
7.0 KiB
C#
227 lines
7.0 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using Dreamteck.Splines;
|
|
using Ichni.Editor;
|
|
using Ichni.RhythmGame.Beatmap;
|
|
using Sirenix.OdinInspector;
|
|
using Unity.VisualScripting;
|
|
using UnityEngine;
|
|
using UnityEngine.UI;
|
|
using UnityEngine.UIElements;
|
|
using Inspector = Ichni.Editor.Inspector;
|
|
|
|
namespace Ichni.RhythmGame
|
|
{
|
|
public abstract partial class GameElement : SerializedMonoBehaviour, IBaseElement
|
|
{
|
|
//物体名
|
|
public string elementName;
|
|
|
|
//标识 GUID
|
|
public Guid elementGuid;
|
|
|
|
//标签
|
|
public List<string> tags;
|
|
|
|
//父游戏物体
|
|
public GameElement parentElement;
|
|
|
|
//与游戏物体连接的Tab
|
|
public HierarchyTab connectedTab;
|
|
|
|
//子物体列表
|
|
public List<GameElement> childElementList = new List<GameElement>();
|
|
|
|
//次级模块
|
|
public List<SubmoduleBase> submoduleList = new List<SubmoduleBase>();
|
|
|
|
//存档类
|
|
public BaseElement_BM matchedBM { get; set; }
|
|
|
|
public Inspector inspector => EditorManager.instance.uiManager.inspector;
|
|
|
|
|
|
/// <summary>
|
|
/// 首次初始化
|
|
/// </summary>
|
|
/// <param name="name">物体名</param>
|
|
public virtual void Initialize(string name, Guid elementGuid, List<string> tags,
|
|
bool isFirstGenerated, GameElement parentElement)
|
|
{
|
|
this.elementName = name;
|
|
this.elementGuid = elementGuid;
|
|
this.tags = tags;
|
|
EditorManager.instance.beatmapContainer.gameElementList.Add(this);
|
|
submoduleList = new List<SubmoduleBase>();
|
|
if (isFirstGenerated) SetDefaultSubmodules();
|
|
SetParent(parentElement);
|
|
EditorManager.instance.uiManager.hierarchy.GenerateTab(this, parentElement);
|
|
|
|
//GameManager.beatMapContainer.beatMapElementList.Add(this);
|
|
//serialNumber = totalSerialNumber++;
|
|
//SetTransformObserver();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置次级模块
|
|
/// </summary>
|
|
protected virtual void SetDefaultSubmodules()
|
|
{
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 在所有物体生成完毕后,执行的初始化方法
|
|
/// </summary>
|
|
public virtual void AfterInitialize()
|
|
{
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 设置父物体
|
|
/// </summary>
|
|
/// <param name="parentElement">父物体</param>
|
|
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 Refresh()
|
|
{
|
|
|
|
}
|
|
|
|
/// <summary>
|
|
/// 用于生成存档
|
|
/// </summary>
|
|
public virtual void SaveBM()
|
|
{
|
|
throw new NotImplementedException();
|
|
}
|
|
|
|
/// <summary>
|
|
/// 当物体被删除时执行的方法
|
|
/// </summary>
|
|
public virtual void OnDelete()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
/// 删除物体,包括所有子物体
|
|
/// </summary>
|
|
public virtual void Delete()
|
|
{
|
|
if (childElementList is { Count: > 0 })
|
|
{
|
|
for (int i = 0; i < childElementList.Count; i++)
|
|
{
|
|
childElementList[i].Delete(); //删除子GameElement、
|
|
}
|
|
}
|
|
|
|
OnDelete();
|
|
|
|
LogWindow.Log("Deleted element: " + elementName);
|
|
|
|
EditorManager.instance.beatmapContainer.gameElementList.Remove(this); //从保存列表中剔除
|
|
|
|
if (connectedTab != null)
|
|
{
|
|
Destroy(connectedTab.gameObject);
|
|
}
|
|
|
|
Destroy(gameObject); //销毁
|
|
}
|
|
}
|
|
|
|
public abstract partial class GameElement
|
|
{
|
|
public virtual void SetUpInspector() //被点击时设置第一层Inspector
|
|
{
|
|
var container = inspector.GenerateContainer("Element Info");
|
|
var nameInputField = inspector.GenerateInputField(this, container, GetType().Name + "'s Name", nameof(elementName));
|
|
var guidText = inspector.GenerateParameterText(this, container, "Element GUID", nameof(elementGuid));
|
|
var tagsListButton = inspector.GenerateButton(this, container, "Tags List", () =>
|
|
{
|
|
inspector.GenerateCompositeParameterWindow(this, "Tags List", nameof(tags)).SetAsStringList();
|
|
});
|
|
foreach (var submodule in submoduleList)
|
|
{
|
|
submodule.SetUpInspector();
|
|
}
|
|
}
|
|
}
|
|
|
|
namespace Beatmap
|
|
{
|
|
[System.Serializable]
|
|
public abstract class GameElement_BM : BaseElement_BM
|
|
{
|
|
[System.NonSerialized]
|
|
public static Dictionary<Guid, GameElement_BM> identifier = new(); //存档类的标识符
|
|
|
|
[System.NonSerialized]
|
|
public GameElement matchedElement; //存档类对应的游戏物体
|
|
|
|
public string elementName;
|
|
public List<string> tags;
|
|
public Guid elementGuid;
|
|
public Guid attachedElementGuid;
|
|
|
|
public GameElement_BM()
|
|
{
|
|
|
|
}
|
|
|
|
public GameElement_BM(string elementName, Guid elementGuid, List<string> 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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// 复制物体
|
|
/// </summary>
|
|
/// <param name="attached">父物体</param>
|
|
public abstract GameElement DuplicateBM(GameElement attached);
|
|
}
|
|
}
|
|
} |