第一步:在Editor文件夹下创建ScriptTemplates文件夹,然后在该文件夹下创建myScript.cs.txt
文件,在该文件里面写模板
第二步:在Editor文件下创建一个C#脚本(Script_04_01 ),该脚本内容为:
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;
public class Script_04_01
{
private const string MY_SCRIPT_DEFAULT = "Assets/Editor/ScriptTemplates/myScript.cs.txt";//脚本模板所在的目录
[MenuItem("Assets/Create/myScript", false, 0)]
public static void CreateMyScript()
{
string locationPath = GetSelectedPathOrFallback();//返回路径
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
ScriptableObject.CreateInstance<MyDoCreateScriptAsset>(),
locationPath+"/myScript.cs",
null,
MY_SCRIPT_DEFAULT
);
}
private 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;
}
}
public 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();
//获得用户输入文件名
string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);
//替换文件名
text = Regex.Replace(text, "#NAME#", fileNameWithoutExtension);
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));
}
}