137 lines
4.7 KiB
C#
137 lines
4.7 KiB
C#
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/ARMaz/创建Art文件夹")]
|
||
static void OpenCreator()
|
||
{
|
||
var w = GetWindowWithRect<EvoArtFolderCreator>(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();
|
||
}
|
||
}
|
||
|
||
/// <summary>
|
||
/// 重新扫描 Modules 子文件夹
|
||
/// </summary>
|
||
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<GameObject>(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, "确定");
|
||
}
|
||
}
|
||
} |