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#脚本时动态修改头部注释信息
  • 五、ScriptHeadComments包工程地址


一、初始化自动添加头部注释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 updatevoid Start(){#NOTRIM#}// Update is called once per framevoid 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 updatevoid Start(){#NOTRIM#}// Update is called once per framevoid 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;
using System.Text.RegularExpressions;namespace ScriptHeadComments.Editor
{public class ScriptsProcessor : UnityEditor.AssetModificationProcessor{private const double NewFileThresholdInSeconds = 1.0; // 1秒的时间阈值/// <summary>/// 当在Unity中新建脚本时会调用/// 当从外部导入新脚本时会调用/// </summary>/// <param name="path"></param>private static void OnWillCreateAsset(string path){ScriptHeadComments scriptHead = Resources.Load<ScriptHeadComments>("ScriptHeadComments");if (scriptHead == null) return;path = path.Replace(".meta", "");if (path.EndsWith(".cs")){//添加判断脚本是否新建的if (!CheckScriptNewBuild(path)) return;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 = Regex.Replace(scriptTemplate, @"\s*#ROOTNAMESPACEBEGIN#", string.Empty);scriptTemplate = scriptTemplate.Replace("#SCRIPTNAME#", Path.GetFileNameWithoutExtension(path));scriptTemplate = scriptTemplate.Replace("#NOTRIM#", "");scriptTemplate = Regex.Replace(scriptTemplate, @"\s*#ROOTNAMESPACEEND#", string.Empty);File.WriteAllText(path, scriptTemplate);}catch (Exception e){Debug.LogException(e);}}}/// <summary>/// 检查脚本是否新建的/// </summary>/// <param name="path"></param>private static bool CheckScriptNewBuild(string path){string fullPath = Path.GetFullPath(path);DateTime lastWriteTime = File.GetLastWriteTime(fullPath);// 如果文件在创建后1秒内被修改,则认为是新建脚本,否则是导入的脚本if (lastWriteTime.AddSeconds(NewFileThresholdInSeconds) >= DateTime.Now){return true;}return false;}/// <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
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp启动图延时效果,启动图的配置

今天阐述uniapp开发中给启动图做延迟效果&#xff0c;不然启动图太快了&#xff0c;一闪就过去了&#xff1b; 一&#xff1a;修改配置文件&#xff1a;manifest.json "app-plus" : {"splashscreen" : {"alwaysShowBeforeRender" : false,"…

法律咨询援助网站

1 项目介绍 1.1 摘要 随着互联网技术的飞速发展&#xff0c;公众对于便捷、高效的法律咨询服务需求日益增长。传统的法律咨询方式已难以满足人们即时性、多样化的咨询需求&#xff0c;促使法律咨询援助网站应运而生。这些平台旨在通过数字化手段&#xff0c;为用户提供法律知…

apache:the requested operation has failed使用httpd -t

Apache24\bin cmd 回车 httpd -t 因为我重新压缩了&#xff0c;记住&#xff0c;重新压缩要使用原路径&#xff0c; 因为你安装的 时候使用的是原路径 还是不行就改个端口&#xff0c;切记修改配置文件httpd.conf先把Tomcat停了 Define SRVROOT "F:\Apache\Apache24&q…

C++类和对象学习笔记

1.类的定义 1.1类定义的格式 class是定义类的关键字&#xff0c;Date为类的名字&#xff0c;{ }中为类的主体&#xff0c;注意定义类结束时后面的分号不能省略。类中的内容称为类的成员&#xff1b;类中的变量称为类的属性或成员变量&#xff1b;类中的函数称为类的方法或者成…

自定义枚举对象序列化规则: 在Json中以枚举的code值表示枚举;枚举序列化时,新增枚举描述字段;String到IEnum的转换

文章目录 引言I 案例分析1.1 接口签名计算1.2 请求对象1.3 枚举对象序列化1.4 创建JavaTimeModule以支持Java 8的时间日期类型序列化和反序列化1.5 请求对象默认值处理II 在JSON中以枚举的code值来表示枚举的实现方式2.1 自定义toString方法返回code2.2 使用@JsonValue注解,只…

adminPage-vue3依赖FormPage说明文档,表单页快速开发,使用思路及范例(Ⅱ)formConfig基础配置项

adminPage-vue3依赖FormPage说明文档&#xff0c;表单页快速开发&#xff0c;使用思路及范例&#xff08;Ⅱ&#xff09;formConfig配置项 属性: formConfig&#xff08;表单项设置&#xff09;keylabelnoLabeldefaultValuebindchildSlottypeString类型数据&#xff08;除 time…

IntelliJ IDEA 2024.1.4最新教程!!直接2099!!爽到飞起!!

IntelliJ IDEA 2024.1.4最新破解教程&#xff01;&#xff01;直接2099&#xff01;&#xff01;爽到飞起&#xff01;&#xff01;【资源在末尾】安装馆长为各位看官准备了多个版本&#xff0c;看官可根据自己的需求进行下载和选择安装。https://mp.weixin.qq.com/s/Tic1iR_Xc…

【鸿蒙学习笔记】关系型数据库概述

目录标题 关系型数据库的运行机制样例代码共通方法 DBUtilsIndex 代码效果 关系型数据库的运行机制 1、 关系型数据库对应用提供通用的操作接口&#xff0c;底层使用SQLite作为持久化存储引擎&#xff0c;支持SQLite具有的数据库特性&#xff0c;包括但不限于事务、索引、视图…

自建邮件服务器有哪些方法步骤与注意事项?

自建邮件服务器如何设置解析&#xff1f;邮件服务器怎么使用&#xff1f; 自建邮件服务器可以为个人或企业提供更多的灵活性和控制权&#xff0c;然而&#xff0c;这也是一个复杂且需要谨慎处理的任务。AokSend将探讨自建邮件服务器的基本方法步骤和需要注意的事项。 自建邮件…

逻辑回归(纯理论)

1.什么是逻辑回归&#xff1f; 逻辑回归是一种常用的统计学习方法&#xff0c;主要用于解决分类问题。尽管名字中包含"回归"&#xff0c;但它实际上是一种分类算法 2.为什么机器学习需要使用逻辑回归 1.二元分类 这是逻辑回归最基本和常见的用途。它可以预测某个事…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【HMAC(C/C++)】

HMAC(C/C) HMAC是密钥相关的哈希运算消息认证码&#xff08;Hash-based Message Authentication Code&#xff09;&#xff0c;是一种基于Hash函数和密钥进行消息认证的方法。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 生…

计算机SCI期刊,闭眼投,保证检索,命中率100%

一、期刊名称 Pervasive and Mobile Computing 二、期刊简介 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机 影响因子&#xff1a;3 中科院分区&#xff1a;3区 三、期刊简介 Pervasive and Mobile Computing Journal &#xff08;PMC&#xff09; 是一本高影响力…

基于前馈神经网络 FNN 实现股票单变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

自定义View-渐变TextView(重点:绘制文本)

源码链接 夸克网盘分享 效果展示 分析 动态效果&#xff0c;使用Animator实现自定义View 继承TextView使用TextView的测量&#xff0c;不重写使用TextView的布局&#xff0c;不重写绘制-重写绘制 使用两种颜色绘制文本颜色占比不同&#xff0c;百分比从0~1 实现 自定义属性…

论文发表作图必备:训练结果对比,多结果绘在一个图片【Precision】【Recall】【mAP0.5】【mAP0.5-0.95】【loss】

前言:Hello大家好,我是小哥谈。YOLO(You Only Look Once)算法是一种目标检测算法,它可以在图像中实时地检测和定位目标物体。YOLO算法通过将图像划分为多个网格,并在每个网格中检测目标物体,从而实现快速的目标检测。本文所介绍的作图教程适用于所有YOLO系列版本算法,接…

Go泛型详解

引子 如果我们要写一个函数分别比较2个整数和浮点数的大小&#xff0c;我们就要写2个函数。如下&#xff1a; func Min(x, y float64) float64 {if x < y {return x}return y }func MinInt(x, y int) int {if x < y {return x}return y }2个函数&#xff0c;除了数据类…

Idea在线搜索Maven依赖-好用工具分享

maven_search 等价于网页搜索maven依赖&#xff0c;非常方便快捷 下载安装后&#xff0c;使用&#xff1a; 点击上方Tools Maven Search 或者快捷键 Ctrl Shift M 最后选择依赖&#xff0c;复制即可

Vue 3 与 TypeScript:最佳实践详解

大家好,我是CodeQi! 很多人问我为什么要用TypeScript? 因为 Vue3 喜欢它! 开个玩笑... 在我们开始探索 Vue 3 和 TypeScript 最佳实践之前,让我们先打个比方。 如果你曾经尝试过在没有 GPS 的情况下开车到一个陌生的地方,你可能会知道那种迷失方向的感觉。 而 Typ…

昇思学习打卡-17-热门LLM及其他AI应用/基于MobileNetv2的垃圾分类

文章目录 网络介绍读取数据集训练训练策略模型保存损失函数优化器模型训练 网络介绍 MobileNetv2专注于移动端、嵌入式或IoT设备的轻量级CNN网络。MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;的思想在准确率小幅度降低的前提下&…

分享一款嵌入式开源LED指示灯控制代码框架cotLed

一、工程简介 cotLed是一款轻量级的LED控制软件框架&#xff0c;可以十分方便地控制及自定义LED的各种状态&#xff0c;移植方便&#xff0c;无需修改&#xff0c;只需要在初始化时实现单片机硬件GPIO初始化&#xff0c;同时为框架接口提供GPIO写函数即可。 框架代码工程地址&a…