根据模板类,我们可以快速的创建一些我们想要的脚本内容,比如我们有接口要在子类上实现,就可以写一个对应的模板,每次创建脚本就会帮我自动实现接口,特别是在UI脚本上经常需要用到这个需求。
c#模板类
// ********************************************************************** // Copyright (C) XM // Author: 吴肖牧 // Date: 2018-02-23 // Desc: // ********************************************************************** using UnityEngine; using System.IO; using System.Text; using System.Text.RegularExpressions; using UnityEditor; using UnityEditor.ProjectWindowCallback; public class CreateScriptUtil:Editor { //EditorApplication.applicationContentsPath Unity模版路径 //该注释的方法无法处理模版内容,故不予以采用 //public static void CreateScriptUtil(string path, string templete) //{ // MethodInfo method = typeof(ProjectWindowUtil).GetMethod("CreateScriptAsset",BindingFlags.Static | BindingFlags.NonPublic); // if (method != null) // { // method.Invoke(null, new object[] { templete, path }); // } //} //[MenuItem("Assets/XM/UILua.lua", false, 1)] //static void CreateMyLua() //{ // CreateScriptUtil(@"UILua.lua", Application.dataPath + "/Scripts/CreateScriptUtil/ScriptTemplates/XM_Lua_UI.lua.txt"); //} //[MenuItem("Assets/XM/XMCSharp.cs", false, 51)] //static void CreateMyCShap() //{ // CreateScriptUtil(@"XMCSharp.cs", Application.dataPath + "/Scripts/CreateScriptUtil/ScriptTemplates/XMCSharp.cs.txt"); //} [MenuItem("Assets/Create/XM/Lua Script", false, 80)] public static void CreatNewLua() { ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(), GetSelectedPathOrFallback() + "/NewLuaScript.lua", null, Application.dataPath + "/Scripts/ScriptTemplates/XM_Lua_UI.lua.txt"); } [MenuItem("Assets/Create/XM/C# Script", false, 81)] public static void CreatNewCSharp() { ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0, ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(), GetSelectedPathOrFallback() + "/NewBehaviourScript.cs", null, Application.dataPath + "/Scripts/ScriptTemplates/XMCSharp.cs.txt"); } public static string GetSelectedPathOrFallback() { string path = "Assets"; foreach (UnityEngine.Object obj in Selection.GetFiltered(typeof(UnityEngine.Object), SelectionMode.Assets)) { path = AssetDatabase.GetAssetPath(obj); if (!string.IsNullOrEmpty(path) && File.Exists(path)) { path = Path.GetDirectoryName(path); break; } } return path; } } class MyDoCreateScriptAsset : EndNameEditAction { public override void Action(int instanceId, string pathName, string resourceFile) { UnityEngine.Object o = CreateScriptAssetFromTemplate(pathName, resourceFile); ProjectWindowUtil.ShowCreatedAsset(o); } internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile) { string fullPath = Path.GetFullPath(pathName); StreamReader streamReader = new StreamReader(resourceFile); string text = streamReader.ReadToEnd(); streamReader.Close(); //TODO:脚本内容处理 string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName); text = Regex.Replace(text, "#SCRIPTNAME#", fileNameWithoutExtension); text = Regex.Replace(text, "#DATE#", System.DateTime.Now.ToString("yyyy-MM-dd")); 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(UnityEngine.Object)); } }
c#模板
// ********************************************************************** // Copyright (C) XM // Author: 吴肖牧 // Date: #DATE# // Desc: // ********************************************************************** using System.Collections; using System.Collections.Generic; using UnityEngine; public class #SCRIPTNAME# : MonoBehaviour { void Start () { } void Update () { } }
我们可以根据项目需求自行拓展模板。