164 lines
5.5 KiB
C#
164 lines
5.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using DG.DemiEditor;
|
|
using Framework;
|
|
using Performance;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
namespace UnitBuildBuilder
|
|
{
|
|
|
|
public class UnitBuildBuilderWindow : EditorWindow
|
|
{
|
|
|
|
private const string OLD_MODEL_PATH = "Assets/Art_Out/OnlyCollect/Building/";
|
|
private const string NEW_MODEL_PATH = "Assets/Art_Out/AutoGen/Building/";
|
|
|
|
[MenuItem("Tools/*建筑工具/构建器", false, (int)NLDMenuID.BuildBuilder)]
|
|
public static void ShowWindow()
|
|
{
|
|
var window = GetWindow<UnitBuildBuilderWindow>("建筑构造器");
|
|
window.Show();
|
|
}
|
|
|
|
private List<UnitBuildBuilderData> _buildDataList;
|
|
|
|
private Vector2 _scrollPos;
|
|
private GUIStyle _styleNormal;
|
|
private GUIStyle _styleError;
|
|
|
|
private void OnGUI()
|
|
{
|
|
if (_buildDataList == null)
|
|
{
|
|
_buildDataList = new List<UnitBuildBuilderData>();
|
|
_FillDataList();
|
|
|
|
_styleNormal = GUI.skin.label.Clone();
|
|
_styleNormal.normal.textColor = Color.white;
|
|
_styleNormal.focused.textColor = Color.white;
|
|
_styleNormal.hover.textColor = Color.white;
|
|
_styleNormal.active.textColor = Color.white;
|
|
|
|
_styleError = GUI.skin.label.Clone();
|
|
_styleError.normal.textColor = Color.red;
|
|
_styleError.focused.textColor = Color.red;
|
|
_styleError.hover.textColor = Color.red;
|
|
_styleError.active.textColor = Color.red;
|
|
}
|
|
|
|
GUILayout.BeginHorizontal();
|
|
GUILayout.Label($"当前共有载具配置, {_buildDataList.Count} 个");
|
|
if (GUILayout.Button("刷新"))
|
|
{
|
|
EditorTableManager.instance.ForceReload();
|
|
_FillDataList();
|
|
}
|
|
GUILayout.EndHorizontal();
|
|
|
|
_ShowAllBuildData();
|
|
|
|
if (GUILayout.Button("开始构建", GUILayout.Height(40)))
|
|
{
|
|
_DoBuild();
|
|
}
|
|
}
|
|
|
|
private void _DoBuild()
|
|
{
|
|
var buildSet = new HashSet<string>();
|
|
for (int i = 0; i < _buildDataList.Count; i++)
|
|
{
|
|
var build = _buildDataList[i];
|
|
if (!build.isChecked)
|
|
{
|
|
continue;
|
|
}
|
|
if (!buildSet.Add(build.modelPath))
|
|
{
|
|
continue;
|
|
}
|
|
_BuildSingle(build);
|
|
}
|
|
}
|
|
|
|
private void _BuildSingle(UnitBuildBuilderData buildData)
|
|
{
|
|
var loadObj = AssetDatabase.LoadAssetAtPath<GameObject>(buildData.modelPath);
|
|
if (loadObj == null)
|
|
{
|
|
Debug.LogError($"模型不存在: {buildData.modelPath}");
|
|
return;
|
|
}
|
|
var combiner = new AutoObjCombine(loadObj);
|
|
combiner.DoCombine(NEW_MODEL_PATH);
|
|
}
|
|
|
|
private void _ShowAllBuildData()
|
|
{
|
|
var totalHeight = _buildDataList.Count * 20 + 20;
|
|
var maxHeight = 400;
|
|
if (totalHeight < maxHeight)
|
|
{
|
|
maxHeight = totalHeight;
|
|
}
|
|
|
|
_scrollPos = GUILayout.BeginScrollView(_scrollPos, GUILayout.Height(maxHeight));
|
|
GUILayout.BeginVertical();
|
|
|
|
for (int i = 0; i < _buildDataList.Count; i++)
|
|
{
|
|
var data = _buildDataList[i];
|
|
var style = data.isPrefabExist ? _styleNormal : _styleError;
|
|
GUILayout.BeginHorizontal();
|
|
data.isChecked = GUILayout.Toggle(data.isChecked, "", GUILayout.Width(20));
|
|
GUILayout.Label("ID:" + data.id, GUILayout.Width(80));
|
|
GUILayout.Label("名字:", GUILayout.Width(40));
|
|
GUILayout.Label(data.buildingName, style, GUILayout.Width(150));
|
|
GUILayout.Label("模型名字:" + data.prefabName, GUILayout.Width(300));
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
|
|
GUILayout.EndVertical();
|
|
GUILayout.EndScrollView();
|
|
|
|
GUILayout.BeginHorizontal();
|
|
if (GUILayout.Button("全选"))
|
|
{
|
|
for (var i = 0; i < _buildDataList.Count; ++i)
|
|
{
|
|
_buildDataList[i].isChecked = true;
|
|
}
|
|
}
|
|
if (GUILayout.Button("全不选"))
|
|
{
|
|
for (var i = 0; i < _buildDataList.Count; ++i)
|
|
{
|
|
_buildDataList[i].isChecked = false;
|
|
}
|
|
}
|
|
GUILayout.EndHorizontal();
|
|
}
|
|
|
|
private void _FillDataList()
|
|
{
|
|
_buildDataList.Clear();
|
|
var configDataList = EditorTableManager.instance.tables.BuildConfig.DataList;
|
|
for (int i = 0; i < configDataList.Count; i++)
|
|
{
|
|
var build = configDataList[i];
|
|
var data = new UnitBuildBuilderData();
|
|
data.id = build.Id;
|
|
data.buildingName = build.Name;
|
|
var oldModelPath = OLD_MODEL_PATH + build.ModelPath + ".prefab";
|
|
data.modelPath = oldModelPath;
|
|
data.prefabName = build.ModelPath;
|
|
data.isPrefabExist = AssetDatabase.LoadAssetAtPath<GameObject>(oldModelPath) != null;
|
|
_buildDataList.Add(data);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
}
|