Unity之VS脚本自动添加头部注释Package包开发

内容将会持续更新,有错误的地方欢迎指正,谢谢!

Unity之VS脚本自动添加头部注释Package包开发


|-----------------------------------------------------|
| TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 ------ 不断努力,不断进步,不断探索 |

|------------------------------------------------------------|
| TechX ------ 心探索、心进取! 助力快速掌握 头部注释 自动添加 为初学者节省宝贵的学习时间,避免困惑! |

前言:

在 Unity 开发中,我们常常需要在创建新脚本时添加一些标准化的头注释,例如作者姓名、创建日期等。手动添加这些信息既麻烦又容易出错。本文将介绍在创建C# Scripts时如何自动添加脚本注释头,并提供一个完整的示例代码。

TechX 教程效果:


文章目录


一、初始化自动添加头部注释Package包ScriptHeadComments

从零开始创建Unity自定义包Package:一步一步实现您的功能

1、创建Package包

在工程文件的Packages文件夹下创建一个文件夹作为包的根目录,文件夹的名称为com.fxb.scriptheadcomments_v1.0.0,文件夹结构如下图所示:

  • Editor文件夹:

    放置Unity编辑器脚本。

  • Resources文件夹:

    包含这个包用到的一些资源文件。

  • CHANGELOG.md日志记录文件:

    文件中记录新增功能、改进和错误修复等信息。

  • package.json包清单文件:

    包含包的元信息,如名称、版本、依赖项等。

2、编译包清单文件package.json

打开package.json文件,填入以下包清单信息。

csharp 复制代码
{
  "name": "com.fxb.scriptheadcomments",
  "displayName": "ScriptHeadComments",
  "version": "1.0.0",
  "unity": "2021.3",
  "description": "Displays the script header information",
  "keywords": [
    "scripthead",
    "script",
    "head",
    "comments"
  ],
  "unityRelease": "38f1"
}

等待Unity编译完成,可以查看到该包已经导入到工程中。

3、添加Assembly Definition程序集

在Editor文件夹中添加一个程序集,通过Create/Assembly Definition创建com.fxb.ScriptHeadComments.Editor程序集

创建完成后,设置Platforms平台为Edito。


二、修改C# ScriptTemplate文件

1、查找Unity默认C# 脚本模板81-C# Script-NewBehaviourScript.cs.txt

在Unity中新建C# Script时,Unity使用的是编辑器中默认的C#脚本模板。我们可以直接在该模板文件中添加自定义注释。

我安装的Unity版本是Unity 2021.3.38f1,脚本模板文件在Unity 2021.3.38f1\Editor\Data\Resources\ScriptTemplates文件夹下

其中81-C# Script-NewBehaviourScript.cs.txt为C# 脚本模板。

2、编辑脚本模板81-C# Script-NewBehaviourScript.cs.txt

使用记事本打开81-C# Script-NewBehaviourScript.cs.txt文件,并在头部添加注释信息

  • 公司:Company
  • 项目:Project
  • 文件:FileName
  • 作者:Author
  • 日期:Date
  • 功能:Function
csharp 复制代码
/*************************************************************************
 *  Copyright © 2023-2030 Administrator. All rights reserved.
 *------------------------------------------------------------------------
 *  公司:DefaultCompany
 *  项目:Unity
 *  文件:NewBehaviourScript.cs
 *  作者:Administrator
 *  日期:2024/7/4 20:11:28
 *  功能:Nothing
*************************************************************************/

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

    #ROOTNAMESPACEBEGIN#
public class #SCRIPTNAME# : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        #NOTRIM#
    }

    // Update is called once per frame
    void Update()
    {
        #NOTRIM#
    }
}
#ROOTNAMESPACEEND#

在Unity中新建一个脚本,可以查看到我们添加的脚本已经有了头部注释信息。


三、创建动态注释头ScriptTemplate

从上面的操作来看,如果直接在Unity的默认C#脚本模板中添加注释头,那么在新建脚本的时候,头部的注释信息是无法改变的,这不是我们想要的,我们需要的应该是在新建脚本的时候头部注释信息应该是能动态变化的。

1、创建动态注释头ScriptTemplate

  • 公司:#COMPANYNAME#
  • 项目:#PROJECTNAME#
  • 文件:#FILEEXTENSION#
  • 作者:#AUTHORNAME#
  • 日期:#CREATETIME#
  • 功能:Nothing

这里使用特殊占位符进行占位

csharp 复制代码
/*************************************************************************
 *  Copyright © 2023-2030 #USERNAME#. All rights reserved.
 *------------------------------------------------------------------------
 *  公司:#COMPANYNAME#
 *  项目:#PROJECTNAME#
 *  文件:#FILEEXTENSION#
 *  作者:#AUTHORNAME#
 *  日期:#CREATETIME#
 *  功能:Nothing
*************************************************************************/

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

namespace #ASSEMBLYNAME#
{
        #ROOTNAMESPACEBEGIN#
    public class #SCRIPTNAME# : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            #NOTRIM#
        }

        // Update is called once per frame
        void Update()
        {
            #NOTRIM#
        }
    }
    #ROOTNAMESPACEEND#
}

这里不在直接在Unity默认C# 脚本模板81-C# Script-NewBehaviourScript.cs.txt中进行添加注释头

而是在包路径的Resources中添加一个81-C# Script-NewBehaviourScript.cs.txt文件,讲下面内容粘贴到该模板文件中。

2、创建脚本注释头部信息ScriptableObject资源

将要动态写入脚本模板的信息保存到ScriptableObj资源中,在创建脚本的时候就可以读取ScriptableObject中的变量并写入到脚本模板中。

在Editor文件夹中新建脚本ScriptHeadComments

csharp 复制代码
using System;
using UnityEngine;

namespace ScriptHeadComments.Editor
{
    [CreateAssetMenu(fileName = "ScriptHeadComments", menuName = "ScriptableObjects/ScriptHeadComments", order = 1)]
	public class ScriptHeadComments : ScriptableObject
	{
        [SerializeField]
        [HideInInspector]
        private bool isInitialized;
		public string authorName;
        public string assembleName;

        private void OnEnable()
        {
            if (!isInitialized)
            {
                authorName = Environment.UserName;
                assembleName = "NAMESPACE";
                isInitialized  = true;
            }
        }
    }
}

在Resources文件家中通过Create/ScriptableObjects/ScriptHeadComments创建一个ScriptHeadComments资源。


四、创建C#脚本时动态修改头部注释信息

AssetModificationProcessor 类是 Unity 编辑器中用于处理资产修改事件的一个类。它提供了一系列静态方法,这些方法在 Unity 的资产(例如脚本、预制件、材质等)被创建、移动或删除时被调用。通过继承 AssetModificationProcessor 类,可以在这些资产修改事件发生时执行自定义的逻辑。

当脚本被创建时,OnWillCreateAsset 会被调用,我们在这里处理注释头信息。

在Editor文件夹中新建脚本ScriptsProcessor

csharp 复制代码
using System;
using System.IO;
using System.Reflection;
using UnityEditor;
using UnityEngine;

namespace ScriptHeadComments.Editor
{
    public class ScriptsProcessor : AssetModificationProcessor
    {
        private static void OnWillCreateAsset(string path)
        {
            ScriptHeadComments scriptHead = Resources.Load<ScriptHeadComments>("ScriptHeadComments");
            if (scriptHead == null) return;
            path = path.Replace(".meta", "");
            if (path.EndsWith(".cs"))
            {
                try
                {
                    string scriptTemplate = File.ReadAllText(SourceScriptTemplatePath);

                    scriptTemplate = scriptTemplate.Replace("#USERNAME#", Environment.UserName);
                    scriptTemplate = scriptTemplate.Replace("#COMPANYNAME#", PlayerSettings.companyName);
                    scriptTemplate = scriptTemplate.Replace("#PROJECTNAME#", PlayerSettings.productName);
                    scriptTemplate = scriptTemplate.Replace("#FILEEXTENSION#", Path.GetFileName(path));
                    scriptTemplate = scriptTemplate.Replace("#AUTHORNAME#", scriptHead.authorName);
                    scriptTemplate = scriptTemplate.Replace("#CREATETIME#", string.Concat(DateTime.Now.ToString("d"), " ", DateTime.Now.Hour, ":", DateTime.Now.Minute, ":", DateTime.Now.Second));
                    scriptTemplate = scriptTemplate.Replace("#ASSEMBLYNAME#", scriptHead.assembleName);
                    scriptTemplate = scriptTemplate.Replace("#ROOTNAMESPACEBEGIN#", string.Empty);
                    scriptTemplate = scriptTemplate.Replace("#SCRIPTNAME#", Path.GetFileNameWithoutExtension(path));
                    scriptTemplate = scriptTemplate.Replace("#NOTRIM#", "");
                    scriptTemplate = scriptTemplate.Replace("#ROOTNAMESPACEEND#", string.Empty);

                    File.WriteAllText(path, scriptTemplate);
                }  
                catch (Exception e)
                {
                   Debug.LogException(e);
                }
            }
        }

        /// <summary>
        /// 源脚本模板
        /// </summary>
        static string SourceScriptTemplatePath
        {
            get
            {
                var assembly = Assembly.GetExecutingAssembly();

                var pInfo = UnityEditor.PackageManager.PackageInfo.FindForAssembly(assembly);

                if (pInfo == null)
                    return null;

                var customTemplatePath = Path.GetFullPath(pInfo.assetPath);

                customTemplatePath = Path.Combine(customTemplatePath, "Resources/81-C# Script-NewBehaviourScript.cs.txt");

                customTemplatePath = customTemplatePath.Replace('\\', '/');

                return customTemplatePath;
            }
        }
    }
}

读取模板文件内容,并替换其中的占位符,将修改后的模板内容写入新创建的脚本文件中。

五、ScriptHeadComments包工程地址

工程地址:

https://gitcode.com/CTLittleNewbie/com.fxb.scriptheadcomments_v1.0.0


|-----------------------------------------------|
| TechX ------ 心探索、心进取! 每一次跌倒都是一次成长 每一次努力都是一次进步 |


END 感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

相关推荐
牙膏上的小苏打23332 小时前
Unity Surround开关后导致获取主显示器分辨率错误
unity·主屏幕
Unity大海4 小时前
诠视科技Unity SDK开发环境配置、项目设置、apk打包。
科技·unity·游戏引擎
浅陌sss9 小时前
Unity中 粒子系统使用整理(一)
unity·游戏引擎
维度攻城狮14 小时前
实现在Unity3D中仿真汽车,而且还能使用ros2控制
python·unity·docker·汽车·ros2·rviz2
为你写首诗ge17 小时前
【Unity网络编程知识】FTP学习
网络·unity
神码编程19 小时前
【Unity】 HTFramework框架(六十四)SaveDataRuntime运行时保存组件参数、预制体
unity·编辑器·游戏引擎
菲fay20 小时前
Unity 单例模式写法
unity·单例模式
火一线1 天前
【Framework-Client系列】UIGenerate介绍
游戏·unity
ZKY_241 天前
【工具】Json在线解析工具
unity·json
ZKY_241 天前
【Unity】处理文字显示不全的问题
unity·游戏引擎