unity 利用UnityEditor.AssetModificationProcessor自动添加头部注释

在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);
        }
    }
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值