using System; using System.Collections.Generic; using Framework.GameBuild; using Framework.Manager; using JetBrains.Annotations; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using Sirenix.Utilities; using Sirenix.Utilities.Editor; using UnityEditor; using UnityEngine; using UnityEngine.Serialization; public class GameBuildWindow : OdinEditorWindow { [Serializable] public class NodeEditor { [LabelText("挂点")] [ReadOnly] public string name; [LabelText("选项数量")] [ReadOnly] public int count; [LabelText("选项实例")] public List nodeObj; public NodeEditor(string name, int count) { this.name = name; this.count = count; nodeObj = new List(); } } private const string NodeRootPath = "UI/UIRoot/UIMainBuild/Build/Root"; private const string NodeTemplatePath = "Assets/Art/GameBuild/Prefab/Node.prefab"; private const string OptionTemplatePath = "Option"; private const string NodeName = "Node{0}"; private const string OptionName = "Option{0}"; /// /// 当前窗口 /// private static GameBuildWindow _curWindow; /// /// 挂点Root /// private GameObject _buildRoot; /// /// 当前建造编辑器数据 /// private BuildEditor _buildEditor; [LabelText("当前建造数据")] [VerticalGroup("BuildInfo")] public BuildData curBuildData; public static void OpenWindow(BuildEditor buildEditor) { _curWindow = GetWindow(); _curWindow.position = GUIHelper.GetEditorWindowRect().AlignCenter(800, 600); _curWindow.curBuildData = null; _curWindow._buildEditor = buildEditor; _curWindow._buildRoot = GameObject.Find(NodeRootPath); } [VerticalGroup("BuildInfo/Create")] [Button("创建/更新 节点实例")] public void UpdateNode() { switch (curBuildData.unlockType) { case UnlockType.ForGroup: InitBuildInfo(curBuildData.nodeCount); break; case UnlockType.ForThematic: InitBuildInfo(curBuildData.thematicCount); break; default: DebugUtil.LogError("解锁条件错误"); break; } CreateNodeObj(); } /// /// 初始化建造数据 /// private void InitBuildInfo(int count) { //挂点初始化 curBuildData.nodeInfos = new List(curBuildData.nodeCount); for (int i = 0; i < curBuildData.nodeCount; i++) { var node = new BuildData.BuildNode(string.Format(NodeName, i + 1)); curBuildData.nodeInfos.Add(node); } //解锁条件初始化 curBuildData.unlockInfos = new List(count); for (int i = 0; i < count; i++) { var unlock = new BuildData.UnlockInfo(); curBuildData.unlockInfos.Add(unlock); } } /// /// 创建挂点实例 /// private void CreateNodeObj() { //清除 DeleteNode(); editorNodes = new List(curBuildData.nodeCount); var nodeTemplate = AssetDatabase.LoadAssetAtPath(NodeTemplatePath); foreach (var node in curBuildData.nodeInfos) { var nodeObj = Instantiate(nodeTemplate, _buildRoot.transform); nodeObj.name = node.name; //编辑下的资源节点 var optionTemplate = nodeObj.transform.Find(OptionTemplatePath).gameObject; var tempEditorNode = new NodeEditor(node.name, curBuildData.thematicCount); for (int i = 0; i < curBuildData.thematicCount; i++) { var optionObj = Instantiate(optionTemplate, nodeObj.transform); optionObj.name = string.Format(OptionName, i + 1); tempEditorNode.nodeObj.Add(optionObj); } editorNodes.Add(tempEditorNode); optionTemplate.SetActive(false); } } [VerticalGroup("Node")] [LabelText("编辑挂点资源")] public bool editorNodeResource; [VerticalGroup("Node/Info")] [LabelText("挂点资源")] [ShowIf("@editorNodeResource")] public List editorNodes; [VerticalGroup("Node/NodeCreate")] [Button("创建选项资源")] [ShowIf("@editorNodeResource")] public void CreateNodeResource() { foreach (var editorNode in editorNodes) { for (int i = 0; i < editorNode.count; i++) { } } } private void DeleteNode() { foreach (Transform child in _buildRoot.transform) { DebugUtil.LogError(child.name); DestroyImmediate(child.gameObject); } } }