using System; using System.IO; using UnityEditor; using Random = UnityEngine.Random; public class GameBuildHelper { private const string BuildSceneTemplate = "Assets/Scenes/BuildTemplate.unity"; [MenuItem("Assets/创建建造场景")] private static void CreateLevel() { var currDir = GetCurrentAssetDirectory().Replace("\\", "/"); var dirName = Path.GetFileName(currDir); var count = AssetDatabase.FindAssets("t:SceneAsset", new[] { currDir }).Length + 1; var savePath = GetAssetUniquePath($"{currDir}/{dirName}_{count}.unity", out var assetName); AssetDatabase.CopyAsset(BuildSceneTemplate, savePath); var newScene = AssetDatabase.LoadAssetAtPath(savePath); EditorGUIUtility.PingObject(newScene); } private static string GetCurrentAssetDirectory() { foreach (UnityEngine.Object obj in Selection.GetFiltered(SelectionMode.Assets)) { var path = AssetDatabase.GetAssetPath(obj); if (string.IsNullOrEmpty(path)) continue; if (System.IO.Directory.Exists(path)) return path; else if (System.IO.File.Exists(path)) return System.IO.Path.GetDirectoryName(path); } return "Assets"; } /// /// 获取一个唯一的路径用于保存asset,假设传入的路径已经存在,则自动生成一个新的 /// /// 尝试保存的路径 /// 第一个string是唯一路径,第二个string是asset的新名字 private static string GetAssetUniquePath(string assetPath, out string assetName) { assetName = Path.GetFileNameWithoutExtension(assetPath); var extension = Path.GetExtension(assetPath); var dir = Path.GetDirectoryName(assetPath); var savedAsset = AssetDatabase.LoadAssetAtPath(assetPath); if (savedAsset == null) { return assetPath; } assetName = $"{assetName}_{Random.Range(0, 10000)}"; var newAssetPath = $"{dir}/{assetName}{extension}"; return GetAssetUniquePath(newAssetPath, out assetName); } }