Unity エディター - カスタム スクリプト テンプレート
Unityエディター用のスクリプトテンプレート
Unity エディターのスクリプト テンプレート フォルダーに独自のテンプレートを追加します。エディターを再起動すると、自動的に認識され、 Assets/Create (プロジェクトの右クリック メニュー)に利用可能なテンプレートが表示されます。
注: カスタム テンプレートを追加した後、有効にするためにエディタを再起動する必要があります。
テンプレート ファイルの場所: エディターのインストール場所\Editor\Data\Resources\ScriptTemplates
テンプレート ファイルの命名形式の説明: (81-Script__MonoBehaviour-NewBehaviour.cs.txt を例にします)
81 | 脚本 | モノビヘイビア | NewBehavior.cs |
---|---|---|---|
メニューの場所 | メニュー名 (__ で区切ることができ、複数レベルのサブメニュー) | オプション名 | デフォルトのファイル名 |
テンプレート内の一般的なキーワードの説明:
#ルートネームスペースの開始# | #ルートネームスペースEND# | #スクリプト名# | #名前# |
---|---|---|---|
スクリプトのルート名前空間をマークします。 | スクリプトのルート名前空間をマークします。 | ファイル名 (C# スクリプトはデフォルトでファイル名をクラス名に設定します) | ファイル名 (シェーダーはデフォルトでファイル名をシェーダー名に設定します) |
スクリプト テンプレートをエディターのインストール場所 \Editor\Data\Resources\ScriptTemplatesに直接配置する場合、エディターをアップグレードするときに、新しくインストールされたエディターに対して上記の操作を繰り返す必要があります。このために、スクリプト テンプレートを直接配置できます (同じ命名規則を持つ ) は、Assets/ScriptTemplates フォルダーに保存されます。Unity エディターを再起動すると、エディターがそれを自動的に認識し、右クリック メニューに表示します。その後、Assets/ScriptTemplates フォルダーを .unitypackage にエクスポートして使用します。他のプロジェクトでも。
メニュー項目
まず、スクリプト テンプレート ScriptTemplate.cs.txt を準備し、Assets/ScriptTemplatesフォルダーに配置します。
/*
┌────────────────────────────┐
│ Description:
│ Author:
│ Remark:可在自定义的脚本模板中按自身需求添加版权信息、脚本说明等
└────────────────────────────┘
┌──────────────┐
│ ClassName:#SCRIPTNAME#
└──────────────┘
*/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
#ROOTNAMESPACEBEGIN#
public class #SCRIPTNAME# : MonoBehaviour
{
}
#ROOTNAMESPACEEND#
エディター スクリプト CreateMyScript.cs を Assets/Scripts/Editor フォルダーに追加します。
using System.IO;
using System.Text.RegularExpressions;
using System.Text;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;
public static class CreateScript
{
[MenuItem("Assets/Create/My Script", false, 80)]
public static void CreatNewLua()
{
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
ScriptableObject.CreateInstance<CreateScriptAsset>(),
GetSelectedPathOrFallback() + "/NewScript.cs",
null,
"Assets/ScriptTemplates/ScriptTemplate.cs.txt");
}
public static string GetSelectedPathOrFallback()
{
string path = "Assets";
foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets))
{
path = AssetDatabase.GetAssetPath(obj);
if (!string.IsNullOrEmpty(path) && File.Exists(path))
{
path = Path.GetDirectoryName(path);
break;
}
}
return path;
}
class CreateScriptAsset : EndNameEditAction
{
public override void Action(int instanceId, string pathName, string resourceFile)
{
UnityEngine.Object o = CreateScriptAssetFromTemplate(pathName, resourceFile);
ProjectWindowUtil.ShowCreatedAsset(o);
}
internal static Object CreateScriptAssetFromTemplate(string pathName, string resourceFile)
{
string fullPath = Path.GetFullPath(pathName);
StreamReader streamReader = new StreamReader(resourceFile);
string text = streamReader.ReadToEnd();
streamReader.Close();
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);
text = Regex.Replace(text, "#SCRIPTNAME#", fileNameWithoutExtension);
text = Regex.Replace(text, "#ROOTNAMESPACEBEGIN#", string.Empty);
text = Regex.Replace(text, "#ROOTNAMESPACEEND#", string.Empty);
bool encoderShouldEmitUTF8Identifier = true;
bool throwOnInvalidBytes = false;
UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
bool append = false;
StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
streamWriter.Write(text);
streamWriter.Close();
AssetDatabase.ImportAsset(pathName);
return AssetDatabase.LoadAssetAtPath(pathName, typeof(Object));
}
}
}
参考文献
https://www.xuanyusong.com/archives/3732
https://github.com/hubertgdev/unity-script-templates