59 lines
2.3 KiB
C#
59 lines
2.3 KiB
C#
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<SceneAsset>(savePath);
|
||
EditorGUIUtility.PingObject(newScene);
|
||
}
|
||
|
||
private static string GetCurrentAssetDirectory()
|
||
{
|
||
foreach (UnityEngine.Object obj in Selection.GetFiltered<Object>(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";
|
||
}
|
||
|
||
/// <summary>
|
||
/// 获取一个唯一的路径用于保存asset,假设传入的路径已经存在,则自动生成一个新的
|
||
/// </summary>
|
||
/// <param name="assetPath">尝试保存的路径</param>
|
||
/// <returns>第一个string是唯一路径,第二个string是asset的新名字</returns>
|
||
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<UnityEngine.Object>(assetPath);
|
||
if (savedAsset == null)
|
||
{
|
||
return assetPath;
|
||
}
|
||
|
||
assetName = $"{assetName}_{Random.Range(0, 10000)}";
|
||
var newAssetPath = $"{dir}/{assetName}{extension}";
|
||
return GetAssetUniquePath(newAssetPath, out assetName);
|
||
}
|
||
} |