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("建筑构造器"); window.Show(); } private List _buildDataList; private Vector2 _scrollPos; private GUIStyle _styleNormal; private GUIStyle _styleError; private void OnGUI() { if (_buildDataList == null) { _buildDataList = new List(); _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(); 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(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(oldModelPath) != null; _buildDataList.Add(data); } } } }