using System; using System.Collections.Generic; using UnityEditor; using UnityEditorInternal; using UnityEngine; using XGame.Framework; namespace XGame.Editor { [CustomEditor(typeof(XGameConfig))] internal class XGameConfigInspector : UnityEditor.Editor { private SerializedProperty script; private SerializedProperty productName; /// /// 项目的启动Assembly GUID /// public SerializedProperty launchAssemblyGUID; /// /// 项目的启动Assembly 名字 /// public SerializedProperty launchAssemblyName; private SerializedProperty launchSceneGUID; private SerializedProperty launchSceneName; /// /// 项目的启动脚本GUID /// private SerializedProperty gameLogicGUID; /// /// 项目的启动脚本名字 /// private SerializedProperty gameLogicTypeName; private string _productName; private AssemblyDefinitionAsset _launchAssembly; private SceneAsset _launchScene; private MonoScript _gameLogicScript; private HashSet _lsApplies = new HashSet(); private void OnEnable() { script = serializedObject.FindProperty("m_Script"); productName = serializedObject.FindProperty("productName"); launchAssemblyGUID = serializedObject.FindProperty("launchAssemblyGUID"); launchAssemblyName = serializedObject.FindProperty("launchAssemblyName"); launchSceneGUID = serializedObject.FindProperty("launchSceneGUID"); launchSceneName = serializedObject.FindProperty("launchSceneName"); gameLogicGUID = serializedObject.FindProperty("gameLogicGUID"); gameLogicTypeName = serializedObject.FindProperty("gameLogicTypeName"); _productName = productName.stringValue; if (string.IsNullOrEmpty(launchAssemblyGUID.stringValue)) { _launchAssembly = null; } else { _launchAssembly = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(launchAssemblyGUID.stringValue)); } if (string.IsNullOrEmpty(launchSceneGUID.stringValue)) { _launchScene = null; } else { _launchScene = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(launchSceneGUID.stringValue)); } if (string.IsNullOrEmpty(gameLogicGUID.stringValue)) { _gameLogicScript = null; } else { _gameLogicScript = AssetDatabase.LoadAssetAtPath(AssetDatabase.GUIDToAssetPath(gameLogicGUID.stringValue)); } } private void OnDisable() { _lsApplies.Clear(); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.BeginVertical(); { DrawScript(); DrawSettings(); DrawApply(); serializedObject.ApplyModifiedProperties(); } EditorGUILayout.EndVertical(); } private void DrawScript() { EditorGUI.BeginDisabledGroup(true); EditorGUILayout.PropertyField(script); EditorGUI.EndDisabledGroup(); GUILayout.Space(5); } private void DrawSettings() { //settings EditorGUILayout.BeginVertical("Box"); { GUILayout.Space(5); GUIStyle labelStyle = new GUIStyle("Label") { alignment = TextAnchor.MiddleLeft, fontStyle = FontStyle.BoldAndItalic, fontSize = 15 }; EditorGUILayout.LabelField(new GUIContent("Settings:"), labelStyle, GUILayout.Height(20)); GUILayout.Space(5); EditorGUILayout.BeginHorizontal(); { GUILayout.Space(15); EditorGUILayout.BeginVertical("Box"); { GUILayout.Space(5); _productName = EditorGUILayout.TextField(new GUIContent("Product Name", "项目名字"), _productName); _launchAssembly = EditorGUILayout.ObjectField(new GUIContent("Launch Assembly", "项目的启动动态库"), _launchAssembly, typeof(AssemblyDefinitionAsset), true) as AssemblyDefinitionAsset; _launchScene = EditorGUILayout.ObjectField(new GUIContent("Launch Scene", "启动场景"), _launchScene, typeof(SceneAsset), true) as SceneAsset; _gameLogicScript = EditorGUILayout.ObjectField(new GUIContent("GameLogic", "启动脚本"), _gameLogicScript, typeof(MonoScript), true) as MonoScript; AddApply(() => productName.stringValue = _productName); AddApply(() => { if (_launchAssembly != null) { launchAssemblyName.stringValue = _launchAssembly.name; launchAssemblyGUID.stringValue = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(_launchAssembly)); } else { launchAssemblyName.stringValue = string.Empty; launchAssemblyGUID.stringValue = string.Empty; } }); AddApply(() => { if (_launchScene != null) { launchSceneName.stringValue = _launchScene.name; launchSceneGUID.stringValue = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(_launchScene)); } else { launchSceneName.stringValue = string.Empty; launchSceneGUID.stringValue = string.Empty; } }); AddApply(() => { if (_gameLogicScript != null) { gameLogicTypeName.stringValue = _gameLogicScript.GetClass().AssemblyQualifiedName; gameLogicGUID.stringValue = AssetDatabase.AssetPathToGUID(AssetDatabase.GetAssetPath(_gameLogicScript)); } else { gameLogicTypeName.stringValue = string.Empty; gameLogicGUID.stringValue = string.Empty; } }); } EditorGUILayout.EndVertical(); } EditorGUILayout.EndHorizontal(); GUILayout.Space(20); } EditorGUILayout.EndVertical(); } private void DrawApply() { EditorGUILayout.BeginHorizontal(); EditorGUILayout.Separator(); if (GUILayout.Button("Apply", GUILayout.Width(50))) { DoApply(); } EditorGUILayout.EndHorizontal(); } private void DoApply() { foreach (var action in _lsApplies) action.Invoke(); serializedObject.ApplyModifiedProperties(); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); } private void AddApply(Action apply) { if (apply != null) { _lsApplies.Add(apply); } } } }