diff --git a/Assets/00.ARMazTools/Editor/ARMazTools.editor.asmdef b/Assets/00.ARMazTools/Editor/ARMazTools.editor.asmdef index b5a8333..a00d621 100644 --- a/Assets/00.ARMazTools/Editor/ARMazTools.editor.asmdef +++ b/Assets/00.ARMazTools/Editor/ARMazTools.editor.asmdef @@ -1,7 +1,9 @@ { "name": "ARMazTools.editor", "rootNamespace": "", - "references": [], + "references": [ + "GUID:516ee79c2bc5cf24d849362a3f9036d5" + ], "includePlatforms": [ "Editor" ], diff --git a/Assets/00.ARMazTools/Editor/CreatDomainDirectory.cs b/Assets/00.ARMazTools/Editor/CreatDomainDirectory.cs new file mode 100644 index 0000000..807dc3c --- /dev/null +++ b/Assets/00.ARMazTools/Editor/CreatDomainDirectory.cs @@ -0,0 +1,57 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +[InitializeOnLoad] +public static class CreatDomainDirectory +{ + static CreatDomainDirectory() + { + // 注意 因为这个构造函数会被重复调用, + //所以为了防止quitting和update两个回调被重复添加,需要先移除后添加 + EditorApplication.quitting -= OnEditorQuit; + EditorApplication.quitting += OnEditorQuit; + + Debug.Log(" 自动运行 "); + + if (!EditorPrefs.HasKey("StartUp")) + { + // 通过标记记录是否已经执行过该方法 + OnEditorStartUp(); + EditorPrefs.SetInt("StartUp", 1); + + if (EditorPrefs.GetInt("CreatDomainDirectory") == 0) + { + EditorPrefs.SetInt("CreatDomainDirectory", 1); + bool isOk = EditorUtility.DisplayDialog("提示", "发现目录存在缺失,是否检索并创建缺失目录", "是", "否"); + if (isOk) + { + var DomainAll = EvoArtFolderCreator.RefreshModuleList(); + foreach (var domain in DomainAll) + { + EvoArtFolderCreator.CreateFolders(domain); + } + } + } + } + } + + + /// + /// UnityEditor 关闭时取消标记 + /// + private static void OnEditorQuit() + { + EditorPrefs.DeleteKey("StartUp"); + } + + /// + /// 只会在UnityEditor启动时执行一次 + /// + static void OnEditorStartUp() + { + Debug.Log(" UnityEditor 启动 "); + } +} \ No newline at end of file diff --git a/Assets/00.ARMazTools/Editor/CreatDomainDirectory.cs.meta b/Assets/00.ARMazTools/Editor/CreatDomainDirectory.cs.meta new file mode 100644 index 0000000..9ba6ac9 --- /dev/null +++ b/Assets/00.ARMazTools/Editor/CreatDomainDirectory.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: ea8ae43a0c279e64eb666829f54020fc +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/00.ARMazTools/Editor/EvoArtFolderCreator.cs b/Assets/00.ARMazTools/Editor/EvoArtFolderCreator.cs new file mode 100644 index 0000000..4b65ca2 --- /dev/null +++ b/Assets/00.ARMazTools/Editor/EvoArtFolderCreator.cs @@ -0,0 +1,137 @@ +using System.IO; +using UnityEditor; +using UnityEngine; +using System.Linq; +using Stary.Evo.Editor; + +public class EvoArtFolderCreator : EditorWindow +{ + static string[] moduleNames; // 下拉列表 + static int selectedIndex; // 当前选中的下标 + + [MenuItem("Evo/创建Art文件夹")] + static void OpenCreator() + { + var w = GetWindowWithRect(new Rect(0, 0, 350, 110), true, "创建点位"); + w.minSize = w.maxSize = new Vector2(350, 110); + } + + void OnEnable() + { + RefreshModuleList(); + } + + void OnGUI() + { + GUILayout.Space(10); + + bool hasModule = moduleNames != null && moduleNames.Length > 0; + if (!hasModule) + EditorGUILayout.HelpBox("未找到 Assets/Modules 目录或目录下无子文件夹!", MessageType.Warning); + else + { + EditorGUILayout.LabelField("选择模块(点位)", EditorStyles.boldLabel); + selectedIndex = EditorGUILayout.Popup(selectedIndex, moduleNames); + } + + GUILayout.FlexibleSpace(); + + // ****** 关键:BeginHorizontal 始终闭合 ****** + using (new EditorGUILayout.HorizontalScope()) + { + GUILayout.FlexibleSpace(); + + GUI.enabled = hasModule; // 禁用按钮而不是提前 return + if (GUILayout.Button("创建点位", GUILayout.Width(100), GUILayout.Height(25))) + { + CreateFolders(moduleNames[selectedIndex]); + Close(); + } + if (GUILayout.Button("标记资源", GUILayout.Width(100), GUILayout.Height(25))) + { + MarkAdressable.AddDomainMark(moduleNames[selectedIndex]); + Close(); + } + GUI.enabled = true; + + if (GUILayout.Button("取消", GUILayout.Width(100), GUILayout.Height(25))) + Close(); + } + } + + /// + /// 重新扫描 Modules 子文件夹 + /// + public static string[] RefreshModuleList() + { + string modulesRoot = Path.Combine(Application.dataPath, "Modules"); + if (!Directory.Exists(modulesRoot)) + { + moduleNames = new string[0]; + } + + // 只取一级目录名 + moduleNames = Directory.GetDirectories(modulesRoot) + .Select(p => Path.GetFileName(p)) + .ToArray(); + selectedIndex = 0; + return moduleNames; + } + + // 仅替换原来的 CreateFolders 方法即可 + public static void CreateFolders(string name) + { + string root = Path.Combine(Application.dataPath, "Art", name); + string sceneDir = Path.Combine(root, "Scenes", "Test"); // Scenes/Test + string[] dirs = + { + "Animation", "Effects", "Fbx", "Font", "Materials", + "Prefabs", "Scenes", "Shader", "Textures" + }; + + try + { + /* 1. 创建所有基础目录 */ + foreach (var dir in dirs) + { + string full = Path.Combine(root, dir); + if (!Directory.Exists(full)) Directory.CreateDirectory(full); + } + + /* 2. 再建 Scenes/Test */ + if (!Directory.Exists(sceneDir)) + { + Directory.CreateDirectory(sceneDir); + /* 3. 创建新场景 */ + var newScene = UnityEditor.SceneManagement.EditorSceneManager.NewScene( + UnityEditor.SceneManagement.NewSceneSetup.DefaultGameObjects, + UnityEditor.SceneManagement.NewSceneMode.Single); + + /* 4. 删除默认相机(和灯光)*/ + foreach (var go in newScene.GetRootGameObjects()) + { + if (go.name == "Main Camera" || go.name == "Directional Light") + GameObject.DestroyImmediate(go); + } + + /* 5. 载入并实例化 RKCameraRig.prefab */ + string prefabPath = "Prefabs/BaseSetting/RKCameraRig"; + + var prefab = Resources.Load(prefabPath); + var spawned = (GameObject)PrefabUtility.InstantiatePrefab(prefab); + spawned.name = "RKCameraRig"; + + /* 6. 保存场景 */ + string scenePath = Path.Combine("Assets/Art", name, "Scenes", "Test", "TestScene.unity"); + UnityEditor.SceneManagement.EditorSceneManager.SaveScene(newScene, scenePath); + + AssetDatabase.Refresh(); + EditorUtility.DisplayDialog("成功", $"已生成完整目录及 TestScene(含 RKCameraRig)!", "确定"); + } + } + catch (System.Exception e) + { + EditorUtility.DisplayDialog("错误", "创建失败:\n" + e.Message, "确定"); + } + } +} \ No newline at end of file diff --git a/Assets/00.ARMazTools/Editor/EvoArtFolderCreator.cs.meta b/Assets/00.ARMazTools/Editor/EvoArtFolderCreator.cs.meta new file mode 100644 index 0000000..0568af3 --- /dev/null +++ b/Assets/00.ARMazTools/Editor/EvoArtFolderCreator.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: fa01e64b03de6d74db2dc57df3dcc524 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/00.ARMazTools/package.json b/Assets/00.ARMazTools/package.json index 95d8746..3a6c32a 100644 --- a/Assets/00.ARMazTools/package.json +++ b/Assets/00.ARMazTools/package.json @@ -1,6 +1,6 @@ { "name": "com.staryevo.armaztools", - "version": "1.0.1", + "version": "1.0.2", "displayName": "00.StaryEvo.ARMazTools", "description": "This is an ARMazTools package(后台服务器版本,端口9527)", "unity": "2021.3",