在Unity中创建新的C#脚本时,会自动去加载某个路径下的模版,它的后缀为txt,创建的C#脚本初始自带的内容就是这个模版内的内容。
在Windows下,这个路径为:Unity安装目录\Editor\Data\Resources\ScriptTemplates\81-C# Script-NewBehaviourScript.cs.txt
在Mac下,这个路径为Unity.app/Contents/Resources/ScriptTemplates/81-C# Script-NewBehaviourScript.cs.txt
将81-C# Script-NewBehaviourScript.cs.txt中的内容修改为以下内容
/****************************************************
* FileName: #SCRIPTNAME#
* CompanyName: #CompanyName#
* Author: #Author#
* Email: #Email#
* CreateTime: #CreateTime#
* Version: #Version#
* UnityVersion: #UnityVersion#
* Description: Nothing
*
*****************************************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class #SCRIPTNAME# : MonoBehaviour
{
void Start()
{
#NOTRIM#
}
void Update()
{
#NOTRIM#
}
}
模版中有public class #SCRIPTNAME# : MonoBehaviour这一行,显然是在创建时根据为脚本取的名字,动态地替换掉了模版中的#SCRIPTNAME#。
AssetModificationProcessor这个类可以用来监听Project视图中资源的创建、删除、移动、保存。类里有几个方法,既然要在创建脚本时替换掉模版中##内的关键词,那我们只需要关注OnWillCreateAsset方法就行了,按照翻译,这个方法会在资源被创建之前被调用,而且从例子中看到,这个方法是个static方法。
注意到这个方法有参数string assetName,Unity底层调用这个方法时会把要创建资源的名字作为参数传入。
Unity为我们在底层固化了这种创建新脚本时以文件名替换模版中#SCRIPTNAME#的功能,我们在对其拓展时要实现AssetModificationProcessor类下的OnWillCreateAsset静态方法,在里面根据传入的资源名,读取对应的文本文件,将其中指定的一些##字符串,替换成我们动态获取的信息,随后把文本重新写入到这个模版中。
现在我们要选一个函数打开对应传入参数的文件,可以选用ReadAllText函数,它可以打开一个文本文件,将文件中所有文本读取到一个字符串中,然后自动关闭此文件,位于命名空间System.IO中。
代码如下:
using UnityEngine;
using System.IO;
public class ScriptCreateInit : UnityEditor.AssetModificationProcessor
{
public static readonly string CompanyName = "小林科技有限公司";
public static readonly string Author = "小林";
public static readonly string Email = "849624126@qq.com";
public static readonly string Version = "1.0";
public static void OnWillCreateAsset(string newFile)
{
string newFilePath = newFile.Replace(".meta", "");
string suffix = Path.GetExtension(newFilePath);//获取后缀名
if (suffix != ".cs")
return;
string realPath = Application.dataPath.Replace("Assets", "") + newFilePath;
string scriptContent = File.ReadAllText(realPath);
scriptContent = scriptContent.Replace("#CompanyName#", CompanyName);
scriptContent = scriptContent.Replace("#Author#", Author);
scriptContent = scriptContent.Replace("#Email#", Email);
scriptContent = scriptContent.Replace("#Version#", Version);
scriptContent = scriptContent.Replace("#UnityVersion#", Application.unityVersion);
scriptContent = scriptContent.Replace("#CreateTime#", System.DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
File.WriteAllText(realPath, scriptContent);
}
}
这个修改##信息的脚本(对上面的ScriptCreateInit ),需要放到Editor文件夹下。
之后,你每次新建C#脚本都会带有前缀,非常方便,也很装逼(滑稽脸)。
如图:
20210614添加(无需修改Unity的代码模板)
每换一个Unity都需要改原本的unity的模板太麻烦了,所以用下面这个不需要改模板也能实现同样的效果
using System.IO;
using System;
using UnityEngine;
public class ScriptCreateInit : UnityEditor.AssetModificationProcessor
{
private static string fileDescribe =
"/****************************************************\n" +
"* Unity版本:#UnityVersion#\n" +
"* 文件:#SCRIPTNAME#\n" +
"* 作者:#CreateAuthor#\n" +
"* 邮箱:#Email#\n" +
"* 日期:#CreateTime#\n" +
"* 功能:Nothing\n" +
"*****************************************************/\n\n";
private static string author = "xiaolin";//Environment.UserName
private static string email = "849624126@qq.com";
/// <summary>
/// 在创建资源的时候执行的函数
/// </summary>
/// <param name="path">路径</param>
private static void OnWillCreateAsset(string path)
{
//将.meta后缀屏蔽,避免获取到的是新建脚本时候的 meta 文件
path = path.Replace(".meta", "");
//只对.cs脚本作操作
if (path.EndsWith(".cs"))
{
// 文件名的分割获取
string[] iterm = path.Split('/');
string str = fileDescribe;
//读取该路径下的.cs文件中的所有文本.
str += File.ReadAllText(path);
// 进行关键字的文件名、作者和时间获取,并替换
str = str.Replace("#SCRIPTNAME#", iterm[iterm.Length - 1])
.Replace("#CreateAuthor#", author)
.Replace("#Email#", email)
.Replace("#CreateTime#", string.Format("{0:0000}/{1:00}/{2:00} {3:00}:{4:00}:{5:00}", DateTime.Now.Year,
DateTime.Now.Month, DateTime.Now.Day, DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second))
.Replace("#UnityVersion#", Application.unityVersion)
.Replace(Environment.NewLine+ " // Start is called before the first frame update", "")
.Replace(Environment.NewLine+" // Update is called once per frame", "");
// 重新写入脚本中,完成数据修改
File.WriteAllText(path, str);
}
}
}