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

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

Unity之VS脚本自动添加头部注释Package包开发
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 头部注释 自动添加

为初学者节省宝贵的学习时间,避免困惑!


前言:

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

TechX 教程效果:

在这里插入图片描述


文章目录

  • 一、初始化自动添加头部注释Package包ScriptHeadComments
    • 1、创建Package包
    • 2、编译包清单文件package.json
    • 3、添加Assembly Definition程序集
  • 二、修改C# ScriptTemplate文件
    • 1、查找Unity默认C# 脚本模板81-C# Script-NewBehaviourScript.cs.txt
    • 2、编辑脚本模板81-C# Script-NewBehaviourScript.cs.txt
  • 三、创建动态注释头ScriptTemplate
    • 1、创建动态注释头ScriptTemplate
    • 2、创建脚本注释头部信息ScriptableObject资源
  • 四、创建C#脚本时动态修改头部注释信息


一、初始化自动添加头部注释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文件,填入以下包清单信息。

{
  "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
/*************************************************************************
 *  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

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

/*************************************************************************
 *  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

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

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;
            }
        }
    }
}

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





TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/773141.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Swift 中的方法调用机制

Swift 方法调用详解&#xff1a;与 Objective-C 的对比、V-Table 机制、Witness Table 机制 在 iOS 开发中&#xff0c;Swift 和 Objective-C 是两种常用的编程语言。尽管它们都能用于开发应用程序&#xff0c;但在方法调用的底层机制上存在显著差异。本文将详细介绍 Swift 的…

CD4017 – 带解码输出的十进制计数器

CD4017 IC 是一个十进制计数器&#xff0c;它有 10 个输出&#xff0c;分别代表 0 到 9 的数字。计数器在&#xff08;14号引脚&#xff09;每个时钟脉冲上升时增加 1。计数器达到 9 后&#xff0c;它会在下一个时钟脉冲时从 0 重新开始。 引脚名称管脚 &#xff03;类型描述VD…

【常用工具】Linux命令行Restful接口调试神器——curl脚本

最近的工作经常要涉及到在Linux服务器端和外部系统联调接口&#xff0c;由于Postman无法在命令行使用&#xff0c;这里浅记一个curl脚本模板&#xff1a; #!/bin/bash # 请求标题 TITLE # token信息 TOKEN # url信息 URL # 请求方式 METHODPOST # Restful请求报文 BODYecho -e…

暑假学习DevEco Studio第2天

学习目标&#xff1a; 掌握页面跳转 学习内容&#xff1a; 跳转页面 创建页面&#xff1a; 在“project”窗口。打开“entry>src>main>ets”,右击“pages”&#xff0c;选择“New>ArkTS File”,命名“Second”&#xff0c;点击回车键。 在页面的路由&#xff0…

Go语言--函数类型、匿名函数和闭包

在Go语言中&#xff0c;函数也是一种数据类型&#xff0c;我们可以通过 type 来定义它&#xff0c;它的类型就是所有拥有相同的参数&#xff0c;相同的返回值的一种类型。 语法 通过type给函数类型起名&#xff0c;然后通过名字进行函数的调用 好处&#xff1a;多态 通过统…

【营销策划模型大全】私域运营必备

营销策划模型大全&#xff1a;战略屋品牌屋、电商运营模型、营销战略、新媒体运营模型、品牌模型、私域运营模型…… 该文档是一份策划总监工作模型的汇总&#xff0c;包括战略屋/品牌屋模型、营销战略模型、品牌相关模型、电商运营模型、新媒体运营模型和私域运营模型等&…

​​服务拆分的原则

目录 一、单一职责原则 二、服务自治原则 三、单向依赖 一、单一职责原则 单⼀职责原则原本是面向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多于⼀个导致类变更的原因 在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该…

C++ | Leetcode C++题解之第216题组合总和III

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<vector<int>> res;void backtracking(int k, int n, vector<int> ans){if(k 0 || n < 0){if(k 0 && n 0){res.emplace_back(ans);}return;}int start (ans.size() 0 ?…

恒创科技:HTTP错误码403禁止意味着什么,怎么修复它?

HTTP错误码403禁止意味着客户端无权访问特定网页或服务器。403 错误表示客户端存在问题&#xff0c;无论用户使用的是哪种网络浏览器&#xff0c;都可能发生这种情况。幸运的是&#xff0c;阻止服务器允许访问特定页面的问题通常可以修复。以下是一些常见原因和相应的解决方案。…

【Android源码】Gerrit安装

前言 如果你打开 https://android.googlesource.com/platform/manifest&#xff0c;就会发现&#xff0c;google官方管理Android源码&#xff0c;使用的是Gerrit。Android系统源码是非常大的&#xff0c;用Git肯定是不适合。对于大型项目&#xff0c;得用Gerrit&#xff0c;今…

背包问题(一)

一.P3985 不开心的金明(01背包变式) 解析: 一开始没有看数据范围,直接当01背包直接写了,结果最后4个测试点RE,一看到数据范围就老实了,1e9的数据,数组直接炸,所以不能直接使用一维的01背包.看了一下题解,部分人是通过极差对数据进行分类,按照300进行分开,使用贪心和dp一起做. …

7_1_SVPWM概述

1、SPWM 正弦脉宽调制法&#xff08;SPWM&#xff09;是将每一正弦周期内的多个脉冲作自然或规则的宽度调制&#xff0c;使其依次调制出相当于正弦函数值的相位角和面积等效于正弦波的脉冲序列&#xff0c;形成等幅不等宽的正弦化电流输出。 通过调整占空比使等效电流近似为正弦…

DT浏览器很好用

DT浏览器是一款简单的浏览器&#xff0c;又是强大的浏览器&#xff0c;界面简洁大方&#xff0c;软件使用流畅。DT浏览器的网址收藏&#xff0c;人工智能写作&#xff0c;书法笔记等功能与众不同。DT浏览器的图文识别功能和笔记本搭配使用&#xff0c;可以对内容编辑修改和保存…

时序模型综述论文

时序模型综述论文&#xff1a; A Survey of Time Series Foundation Models: Generalizing Time Series Representation with Large Language Model

c++ String

1.string类 还记得我们数据结构学的串吗&#xff0c;现在在c中&#xff0c;我们有了c提供的标准库&#xff0c;它是一个写好的类&#xff0c;非常方便使用 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作strin…

学习笔记——动态路由——OSPF工作原理(SPF算法)

3、SPF算法 SPF算法(最短路径优先算法&#xff0c;也称Dijkstra算法)由荷兰科学家狄克斯特拉于1959年提出的。 SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离&#xff0c;每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图&#xff0c;该…

MySQL:MySQL总结

文章目录 MySQL思维导图基础实际在 Innodb 存储引擎中&#xff0c;会用一个特殊的记录来标识最后一条记录&#xff0c;该特殊的记录的名字叫 supremum pseudo-record &#xff0c;所以扫描第二行的时候&#xff0c;也就扫描到了这个特殊记录的时候&#xff0c;会对该主键索引加…

基于Bootstrap Blazor开源的.NET通用后台权限管理系统

前言 今天大姚给大家分享一个基于Bootstrap Blazor开源的.NET通用后台权限管理系统&#xff0c;后台管理页面兼容所有主流浏览器&#xff0c;完全响应式布局&#xff08;支持电脑、平板、手机等所有主流设备&#xff09;&#xff0c;可切换至 Blazor 多 Tabs 模式&#xff0c;…

JVM原理(十六):JVM虚拟机类型擦除与泛型发展

1. 泛型 泛型的本质是参数化类型或者参数化多态的应用&#xff0c;即可以将操作的数据类型指定为方法签名中的一种特殊参数&#xff0c;这种参数类型能够用在类、接口和方法的创建中&#xff0c;分别构成泛型类、泛型接口和泛型方法。 泛型让程序员能够以针对泛化的数据类型编…

手动访问mongo和ES插入和查询

1、手动访问mongo 1.1、mongo连接数据库 1.2、mongo插入和查询 db.hmf_test.insert( { "aoeId": "1", "aoeAes": "吴秀梅", "aoeSm4": "北京xx网络技术有限公司.", "aoeSm4_a": "…