Forest_Client/Forest/Assets/Editor/GameBuild/GameBuildWindow.cs

166 lines
5.1 KiB
C#
Raw Normal View History

2024-07-10 19:06:07 +08:00
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<GameObject> nodeObj;
public NodeEditor(string name, int count)
{
this.name = name;
this.count = count;
nodeObj = new List<GameObject>();
}
}
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}";
/// <summary>
/// 当前窗口
/// </summary>
private static GameBuildWindow _curWindow;
/// <summary>
/// 挂点Root
/// </summary>
private GameObject _buildRoot;
/// <summary>
/// 当前建造编辑器数据
/// </summary>
private BuildEditor _buildEditor;
[LabelText("当前建造数据")] [VerticalGroup("BuildInfo")]
public BuildData curBuildData;
public static void OpenWindow(BuildEditor buildEditor)
{
_curWindow = GetWindow<GameBuildWindow>();
_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();
}
/// <summary>
/// 初始化建造数据
/// </summary>
private void InitBuildInfo(int count)
{
//挂点初始化
curBuildData.nodeInfos = new List<BuildData.BuildNode>(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<BuildData.UnlockInfo>(count);
for (int i = 0; i < count; i++)
{
var unlock = new BuildData.UnlockInfo();
curBuildData.unlockInfos.Add(unlock);
}
}
/// <summary>
/// 创建挂点实例
/// </summary>
private void CreateNodeObj()
{
//清除
DeleteNode();
editorNodes = new List<NodeEditor>(curBuildData.nodeCount);
var nodeTemplate = AssetDatabase.LoadAssetAtPath<GameObject>(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<NodeEditor> 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);
}
}
}