问题描述
我熟悉更改Unity游戏引擎脚本模板的功能。但是,它非常有限,并且只允许使用一个关键字:#SCRIPTNAME#
。
随着项目变得越来越复杂,名称空间变得至关重要。而且无法通过Create --> C# Script
使用适当的命名空间来生成脚本。
有人知道对此有什么解决办法吗?
P.S。我知道您可以使用Visual Studio创建文件,这些文件会根据位置自动获取名称空间。但是,它们包含不必要的部分,例如Assets.Scripts
...
解决方法
在线进行一些研究,我发现您可以使用AssetModificationProcessor
方法创建public static void OnWillCreateAsset(string path)
。在这种方法中,您可以读取创建的脚本文件并使用string.Replace
(或其他方法)替换内容。
深入了解这一点,我提供了有用的Editor script,它根据项目中的脚本位置更改了#NAMESPACE#
关键字(全部使用我当前的项目结构进行,因此您可能需要调整脚本正常工作之前。)
万一链接断开,这是编辑器脚本:
using System.IO;
using UnityEditor;
using UnityEngine;
namespace MyGame.Editor.Assets
{
public sealed class ScriptAssetKeywordsReplacer : UnityEditor.AssetModificationProcessor
{
/// <summary>
/// This gets called for every .meta file created by the Editor.
/// </summary>
public static void OnWillCreateAsset(string path)
{
path = path.Replace(".meta",string.Empty);
if (!path.EndsWith(".cs"))
{
return;
}
var systemPath = path.Insert(0,Application.dataPath.Substring(0,Application.dataPath.LastIndexOf("Assets")));
ReplaceScriptKeywords(systemPath,path);
AssetDatabase.Refresh();
}
private static void ReplaceScriptKeywords(string systemPath,string projectPath)
{
projectPath = projectPath.Substring(projectPath.IndexOf("/SCRIPTS/") + "/SCRIPTS/".Length);
projectPath = projectPath.Substring(0,projectPath.LastIndexOf("/"));
projectPath = projectPath.Replace("/Scripts/","/").Replace('/','.');
var rootNamespace = string.IsNullOrWhiteSpace(EditorSettings.projectGenerationRootNamespace) ?
string.Empty :
$"{EditorSettings.projectGenerationRootNamespace}.";
var fullNamespace = $"{rootNamespace}{projectPath}";
var fileData = File.ReadAllText(systemPath);
fileData = fileData.Replace("#NAMESPACE#",fullNamespace);
File.WriteAllText(systemPath,fileData);
}
}
}
在名为Editor
的文件夹下添加此脚本后,您需要更改位于%EditorPath%/Data/Resources/ScriptTemplates/81-C# Script-NewBehaviourScript.cs.txt
的c#脚本模板。打开此文件,并使用
namespace #NAMESPACE#
{
// All the class template can stay the same
}