|
一、首先嘞,咱们先准备好要创建的代码模板,放在指定目录下,我这里的目录是这个样子的Assets/Scripts/ScriptTemplate.cs.txt。然后我们的代码模板,俺是这样滴
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class #NAME# : MonoBehaviour
{
void MyFunction()
{
}
}
<hr/>二、然后,就是咱们的工具(装逼)环节了
开个玩笑,咱们直接看代码,注释都写好了,各位客官请慢用
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;
public class CreateScriptByTemp
{
private const string TempPath = &#34;Assets/Scripts/ScriptTemplate.cs.txt&#34;;
[MenuItem(&#34;Assets/ScriptTemp/Create&#34;, false, -1)]
static void CreateScriptByTmp()
{
//这里,咱们先获取你想创建在哪个文件路径下
string locationPath = GetSelectedPathOrFallBack();
//然后。。。这里我也不知道啥意思了。。。。
//但是!我应该还是能明白一点点的(此处省略我尝试了好多次才知道这是干嘛的过程)
//这里的作用就是新建一个资源文件,但是嘞,还没有确定是啥类型的,那么!!确定类型的事就跑到了第二个参数里面去了
ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
ScriptableObject.CreateInstance<MyCreateScriptAsset>(),
locationPath + &#34;/MyScript.cs&#34;, null, TempPath);
}
private static string GetSelectedPathOrFallBack()
{
string path = &#34;Assets&#34;;
//这个的作用就是获取你鼠标选中的文件夹对象
// Object[] objs = Selection.GetFiltered(typeof(Object), SelectionMode.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;
}
//这个EndNameEditAction,呃。。。顾名思义,,,,等等,我百度翻译一下。。。结束名称编辑操作???算了,不纠结这个,咱们先看代码--->>>
class MyCreateScriptAsset : EndNameEditAction
{
//这个是要重写滴,不然你就会看到那个美丽的红色的线条
public override void Action(int instanceId, string pathName, string resourceFile)
{
//这里可就厉害了,看到这个方法名没有,Action!!一看就很得劲儿
//他这里是这个样子,我们右键点击了某个文件夹之后,点击我们拓展的菜单后会创建出一个资源文件让我们命名
//然后,当我们输入名字后,那这个名字带着它所在的路径跑到pathName里面去,然后resourceFile里面就是咱们的模板路径了
Object o = CreateScriptByTemp(pathName, resourceFile);
ProjectWindowUtil.ShowCreatedAsset(o);
AssetDatabase.Refresh();
}
//这里就是咱们处理模板代码的操作啦,一顿稀里哗啦的操作,然后模板就变成了object,
//然后就用ProjectWindowUtil.ShowCreatedAsset(o)这个东西给他显示出来,、
//然后保险起见,用这个AssetDatabase.Refresh()刷新一下(咳咳,我不知道这里频繁刷新有木有问题哈)
private static Object CreateScriptByTemp(string pathName, string resourceFile)
{
string fullPath = Path.GetFullPath(pathName);
StreamReader streamReader = new StreamReader(resourceFile);
string txt = streamReader.ReadToEnd();
streamReader.Close();
string fileNameWithOutExtension = Path.GetFileNameWithoutExtension(pathName);
txt = Regex.Replace(txt, &#34;#NAME#&#34;, 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(txt);
streamWriter.Close();
AssetDatabase.ImportAsset(txt);
return AssetDatabase.LoadAssetAtPath(pathName, typeof(Object));
}
}
}
献丑结束,谢谢大家捧场
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|