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

news2025/4/4 21:25:38

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

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

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

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

相关文章

【靶机实战】Apache Log4j2命令执行漏洞复现

# 在线靶场 可以通过访问极核官方靶场开启靶机实验&#xff1a;极核靶场 -> 漏洞复现靶场 -> Log4j2-RCE 原文&#xff1a;【靶机实战】Apache Log4j2命令执行漏洞复现 - 极核GetShell (get-shell.com) # 简介 Apache Log4j2 是一个广泛使用的 Java 日志记录库&#…

秋招突击——设计模式补充——简单工厂模式和策略模式

文章目录 引言正文简单工厂模式策略模式策略模式和工厂模式的结合策略模式解析 总结 引言 一个一个来吧&#xff0c;面试腾讯的时候&#xff0c;问了我单例模式相关的东西&#xff0c;自己这方面的东西&#xff0c;还没有看过。这里需要需要补充一下。但是设计模式有很多&…

比赛获奖的武林秘籍:01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象?

比赛获奖的武林秘籍&#xff1a;01 如何看待当代大学生竞赛中“卷”“祖传老项目”“找关系”的现象&#xff1f; 摘要 本文主要分析了大学生电子计算机类比赛中“卷”“祖传老项目”“找关系”的现象&#xff0c;结合自身实践经验&#xff0c;给出了相应的解决方案。 正文 …

1-4 NLP发展历史与我的工作感悟

1-4 NLP发展历史与我的工作感悟 主目录点这里 第一个重要节点&#xff1a;word2vec词嵌入 能够将无限的词句表示为有限的词向量空间&#xff0c;而且运算比较快&#xff0c;使得文本与文本间的运算有了可能。 第二个重要节点&#xff1a;Transformer和bert 为预训练语言模型发…

百日筑基第十一天-看看SpringBoot

百日筑基第十一天-看看SpringBoot 创建项目 Spring 官方提供了 Spring Initializr 的方式来创建 Spring Boot 项目。网址如下&#xff1a; https://start.spring.io/ 打开后的界面如下&#xff1a; 可以将 Spring Initializr 看作是 Spring Boot 项目的初始化向导&#xff…

【Unity navigation面板】

【Unity navigation面板】 Unity的Navigation面板是一个集成在Unity编辑器中的界面&#xff0c;它允许开发者对导航网格&#xff08;NavMesh&#xff09;进行配置和管理。 Unity Navigation面板的一些关键特性和功能&#xff1a; 导航网格代理&#xff08;NavMesh Agent&…

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

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

针对某客户报表系统数据库跑批慢进行性能分析及优化

某客户报表系统数据库跑批时间过长&#xff0c;超出源主库较多&#xff0c;故对其进行了分析调优&#xff0c;目前状态如下&#xff1a; 1、业务连接的rac的scanip&#xff0c;因为负载均衡将跑批的连接连接到了多个计算节点导致节点间通讯成本较高&#xff0c;故速率缓慢&…

Websocket通信实战项目(图片互传应用)+PyQt界面+python异步编程(async) (上)服务器端python实现

Rqtz : 个人主页 ​​ 共享IT之美&#xff0c;共创机器未来 ​ Sharing the Beauty of IT and Creating the Future of Machines Together 目录 项目背景 ​编辑​专有名词介绍 服务器GUI展示 功能(位置见上图序号) 客户端GUI展示&#xff08;h5cssjs&#xf…

allure如何记录操作步骤,操作步骤不写在测试用例中,同样可以体现在allure报告,如何实现

嗨&#xff0c;我是兰若&#xff0c;今天写完用例&#xff0c;在运行用例并且生成报告的时候&#xff0c;发现报告里面没有具体的操作步骤&#xff0c;这可不行&#xff0c;如果没有具体的操作步骤的话&#xff0c;用例运行失败了&#xff0c;要怎么知道问题是出现在哪一个步骤…

Android studio开发入门教程详解(复习)

引言 本文为个人总结Android基础知识复习笔记。如有不妥之处&#xff0c;敬请指正。后续将持续更新更多知识点。 文章目录 引言UITextView文本基本用法实际应用常用属性和方法 Button按钮处理点击事件 EditText输入框基本属性高级特性 ImageView图片ImageView的缩放模式 Prog…

adobe pdf设置默认打开是滚动而不是单页视图

上班公司用adobe pdf&#xff0c;自己还不能安装其它软件。 每次打开pdf&#xff0c;总是默认单页视图&#xff0c;修改滚动后&#xff0c;下次打开又 一样&#xff0c;有时候比较烦。 后面打开编辑->首选项&#xff0c; 如下修改&#xff0c;下次打开就是默认滚动了

数据结构 —— 图的遍历

数据结构 —— 图的遍历 BFS&#xff08;广度遍历&#xff09;一道美团题DFS&#xff08;深度遍历&#xff09; 我们今天来看图的遍历&#xff0c;其实都是之前在二叉树中提过的方法&#xff0c;深度和广度遍历。 在这之前&#xff0c;我们先用一个邻接矩阵来表示一个图&#…

每日Attention学习8——Rectangular self-Calibration Attention

模块出处 [ECCV 24] [link] [code] Context-Guided Spatial Feature Reconstruction for Efficient Semantic Segmentation 模块名称 Rectangular self-Calibration Attention (RCA) 模块作用 空间注意力 模块结构 模块代码 import torch import torch.nn as nn import tor…

【2024版】Microsoft Azure 管理员培训课程招生简章(8月有开班)

课程介绍 本课程专为希望深入了解和精通Microsoft Azure管理的IT专业人员设计。在为期三天的培训中&#xff0c;学员将全面学习如何管理Azure订阅&#xff0c;保护标识&#xff0c;配置虚拟网络&#xff0c;以及实现存储解决方案和虚拟机。此外&#xff0c;课程还涵盖了实现We…

STL——list模拟实现

一、模拟实现源码 #pragma oncenamespace sjx {template <typename T>struct __list_node{__list_node<T>* _next;__list_node<T>* _prev;T _data;__list_node(const T& val T()) :_data(val), _next(nullptr), _prev(nullptr){}};template <typena…

HandlerMethodArgumentResolver :深入spring mvc参数解析机制

❃博主首页 &#xff1a; <码到三十五> ☠博主专栏 &#xff1a; <mysql高手> <elasticsearch高手> <源码解读> <java核心> <面试攻关> ♝博主的话 &#xff1a; 搬的每块砖&#xff0c;皆为峰峦之基&#xff1b;公众号搜索(码到三十…

【Pyhton】读取寄存器数据到MySQL数据库

目录 步骤 modsim32软件配置 Navicat for MySQL 代码实现 步骤 安装必要的库&#xff1a;确保安装了pymodbus和pymysql。 配置Modbus连接&#xff1a;设置Modbus从站的IP地址、端口&#xff08;对于TCP&#xff09;或串行通信参数&#xff08;对于RTU&#xff09;。 连接M…

昇思25天学习打卡营第10天 | 自然语言处理:RNN实现情感分类

1. RNN实现情感分类 1.2 概述 情感分类是自然语言处理中的经典任务&#xff0c;是典型的分类问题。本节使用MindSpore实现一个基于RNN网络的情感分类模型&#xff0c;实现如下的效果&#xff1a; 输入: This film is terrible 正确标签: Negative(负面) 预测标签: Negative输…