欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Unity 自定义脚本模板 添加头部注释 妈妈再也不用担心我换电脑 换unity版本了

程序员文章站 2022-03-22 16:55:27
...

好久没在csdn 上面写文章了,我也捣鼓了一个自己的 blog 有兴趣可以来看看
链接:https://zeroultra.github.io/
回到正题,本文讲如何自定义模板

自定义模板的一些问题

其实有很多文章都写了自定义模板,添加头部注释,例如这篇文章. 都是要找到untiy 自己的模板c# txt,然后写入相关的替代码,在匹配更换,其中的问题:

  1. 当换电脑,或者unity换了一个unity版本之后,又得重新找到模板,写入
  2. 无法添加多个模板

如何自定义模板

这里有两个方法 需要知道 ProjectWindowUtil.CreateAssetWithContentOnWillCreateAsset,可以查查API 手册
https://docs.unity3d.com/ScriptReference/AssetModificationProcessor.OnWillCreateAsset.html
https://docs.unity3d.com/462/Documentation/ScriptReference/ProjectWindowUtil.html

知道这两个方法之后就好做了
我们可以在unity中创建一个Editor文件夹,然后自定义一个 c#模板,我定义了两个,一个继承mono,一个不继承mono(txt文件)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// --(*^__^*) --
/// ____AUTHOR:    #AUTHOR#
/// ____DATE:      #DATE#
/// ____DESC:      #DESC#
/// ____VERSION:	   #VERSION#
/// ____UNITYVERSION:  #UNITYVERSION#
/// --(=^ω^=) --
/// </summary>

public class #SCRIPTNAME# : MonoBehaviour
{
    private void Start()
    {
        
    }
}

另一个

using System.Collections;
/// <summary>
/// --(*^__^*) --
/// ____AUTHOR:    #AUTHOR#
/// ____DATE:      #DATE#
/// ____DESC:      #DESC#
/// ____VERSION:	   #VERSION#
/// --(=^ω^=) --
/// </summary>

public class #SCRIPTNAME# 
{
   public  #SCRIPTNAME#()
   {
   
   }
}

Unity 自定义脚本模板 添加头部注释 妈妈再也不用担心我换电脑 换unity版本了
然后 我们创建一个ScriptTemplatesGenerate.cs

/* 自定义 C# 模板创建
 * 在修改unity自定义的模板之后,换个版本,换个电脑又是原样了
 * 所以得自己定义一个
 *帮助链接
 *("https://blog.csdn.net/mobilebbki399/article/deta
 */


using UnityEngine;
using UnityEditor;
using System;
using System.IO;

public class ScriptTemplatesGenerate
{
    //模板文件位置
    static string tempCshapeMonoBehaviourPath = Application.dataPath + "//Editor/NewBehaviourScriptTemplates.txt";
    static string tempCshapePath = Application.dataPath + "/Editor/NewScriptTemplates.txt";

    [MenuItem("Assets/Create/My C# MonoBehaviour Script", false, 80)]
    static void CreateMyMonoBehaviourCShapeScrtip()
    {

        ScriptGenerate(true);
    }
    [MenuItem("Assets/Create/My C#  Script", false, 80)]
    static void CreateMyCShapeScrtip()
    {

        ScriptGenerate(false);
 
    }

    private static void ScriptGenerate(bool isMonoBehaviour)
    {
        try
        {
            if (isMonoBehaviour)
                ProjectWindowUtil.CreateAssetWithContent("NewBehaviourScript.cs", File.ReadAllText(tempCshapeMonoBehaviourPath), EditorGUIUtility.IconContent("cs Script Icon").image as Texture2D);
            else
                ProjectWindowUtil.CreateAssetWithContent("NewScript.cs", File.ReadAllText(tempCshapePath), EditorGUIUtility.IconContent("cs Script Icon").image as Texture2D);

        }
        catch (Exception ex)
        {
            Debug.LogError("模板文件路径错误!!! " + ex.Message);
        }
    }

    /// <summary>
    /// 给脚本添加标题头
    /// </summary>
    class AddFileHeadComment : UnityEditor.AssetModificationProcessor
    {
        /// <summary>
        /// 此函数在asset被创建,文件已经生成到磁盘上,生成了.meta文件没有正式创建完成之间调用(我觉得) 和import之前被调用
        /// </summary>
        /// <param name="newFileMeta">newfilemeta 是由创建文件的path加上.meta组成的</param>
        public static void OnWillCreateAsset(string newFileMeta)
        {

            //把meta去掉
            string newFilePath = newFileMeta.Replace(".meta", "");
            //得到扩展名
            string fileExt = Path.GetExtension(newFilePath);

            if (fileExt != ".cs") return;

            string realPath = Application.dataPath.Replace("Assets", "") + newFilePath;
            string scriptContent = File.ReadAllText(realPath);

            //这里实现自定义的一些规则
            scriptContent = scriptContent.Replace("#SCRIPTNAME#", Path.GetFileName(Path.GetFileNameWithoutExtension(newFilePath)));
            //scriptContent = scriptContent.Replace("#COMPANY#", PlayerSettings.companyName);
            scriptContent = scriptContent.Replace("#AUTHOR#", "海贼王");
            scriptContent = scriptContent.Replace("#DESC#", "文件描述");
            scriptContent = scriptContent.Replace("#VERSION#", "1.0");
            scriptContent = scriptContent.Replace("#UNITYVERSION#", Application.unityVersion);
            scriptContent = scriptContent.Replace("#DATE#", DateTime.Now.ToString("yyyy-MM-dd"));

            File.WriteAllText(realPath, scriptContent);
            //一定要加这句话 不然 在创建之后点击脚本预览发现还是原来模板效果
            //一开始就是没加这句话 所以有bug 这就导致了第二个方法产生
            AssetDatabase.ImportAsset(newFilePath);
        }
    }
}

代码已经写了注释 就不再多说,最后来看看效果
Unity 自定义脚本模板 添加头部注释 妈妈再也不用担心我换电脑 换unity版本了
可以看到多出了两个菜单选项,然后点击创建即为自定义模板.

我在逛b战的时候发现一篇文章: https://www.bilibili.com/read/cv6097455
这个也可行,我们完全可以把unity自带的模板清空然后在自己的内容写入到.cs文本中,我不这么做就是字符串拼接到时候会很乱 还是自己写个模板放着,放到 自己框架 或者特定的文件夹中即可.

根据这个想法 我们也可以自定义其他模板

其实还有一种方法 ,参考一下,我是觉得稍微麻烦些,不过学点知识也好
https://www.xuanyusong.com/archives/3732

相关标签: unity 编辑器