首页 > 其他分享 >Unity 自定义创建脚本模板

Unity 自定义创建脚本模板

时间:2022-12-12 22:55:23浏览次数:72  
标签:string 自定义 System Replace scriptContent Unity using 模板

Unity 自定义创建脚本模板

原理:以模板代码为底板,通过关键字替换来实现代码创建

两种实现方案

方案1

1.先准备好对应的代码模板,放到Assets\ScriptTemplates目录下

using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using UnityEditor;
using UnityEditor.ProjectWindowCallback;
using UnityEngine;

public class CodeGenerator
{
    private static string systemTemplatePath = "Assets/ScriptTemplates/SystemClass.cs";

    [MenuItem("Assets/Create/C# System Script", false, 70)]
    public static void CreateSystemCS()
    {
        //参数为传递给CreateEventCSScriptAsset类action方法的参数
        ProjectWindowUtil.StartNameEditingIfProjectWindowExists(0,
            ScriptableObject.CreateInstance<CreateSystemCSScriptAsset>(),
            GetSelectPathOrFallback() + "/New Script.cs", null,
            systemTemplatePath);
    }

    public static string GetSelectPathOrFallback()
    {
        string path = "Assets";
        //遍历选中的资源以获得路径
        //Selection.GetFiltered是过滤选择文件或文件夹下的物体,assets表示只返回选择对象本身
        foreach (Object obj in Selection.GetFiltered(typeof(Object), SelectionMode.Assets))
        {
            path = AssetDatabase.GetAssetPath(obj);
            if (!string.IsNullOrEmpty(path) && File.Exists(path))
            {
                path = Path.GetDirectoryName(path);
                break;
            }
        }
        return path;
    }
}

//要创建模板文件必须继承EndNameEditAction,重写action方法
class CreateSystemCSScriptAsset : EndNameEditAction
{
    static string pattern = "SystemClass";

    public override void Action(int instanceId, string pathName, string resourceFile)
    {
        //创建资源
        Object obj = CreateScriptAssetFromTemplate(pathName, resourceFile);
        ProjectWindowUtil.ShowCreatedAsset(obj); //高亮显示资源
    }

    private static Object CreateScriptAssetFromTemplate(string pathName, string resourceFile)
    {
        //获取要创建资源的绝对路径
        string fullPath = Path.GetFullPath(pathName);
        //读取本地的模板文件
        StreamReader streamReader = new StreamReader(resourceFile);
        string text = streamReader.ReadToEnd();
        streamReader.Close();
        //获取文件名,不含扩展名
        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);
        Debug.Log("text===" + text);

        //将模板类中的类名替换成你创建的文件名
        text = Regex.Replace(text, pattern, fileNameWithoutExtension);
        //参数指定是否提供 Unicode 字节顺序标记
        bool encoderShouldEmitUTF8Identifier = true;
        //是否在检测到无效的编码时引发异常
        bool throwOnInvalidBytes = false;
        UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
        bool append = false;
        //写入文件
        StreamWriter streamWriter = new StreamWriter(fullPath, append, encoding);
        streamWriter.Write(text);
        streamWriter.Close();
        
        //刷新资源管理器
        AssetDatabase.ImportAsset(pathName);
        AssetDatabase.Refresh();
        return AssetDatabase.LoadAssetAtPath(pathName, typeof(Object));
    }
}

方案2

使用Unity 自带的模板功能进行配置模板代码

文件名

85-Other Scripts__Scriptable Object-MyClass.cs.txt

对应解释如下:

85 Other Scripts Scriptable Object MyClass .cs
Menu position Menu name Submenu name Default name of the new created file Created file extension

注:子菜单名称可以设置多个,需要用"__"进行分割

文件内容

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

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

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

Unity keys:
■ #NAME#
■ #SCRIPTNAME#
■ #SCRIPTNAME_LOWER#
■ #NOTRIM#

配置步骤

1.找到项目中的ScriptTemplates文件夹 新建脚本文件

2.补充代码模板,并按规则进行命名

3.如果想添加自定义的关键字,需要添加脚本进行对应关键字的替换

在自己的Unity工程中,创建Editor文件夹,在文件夹内创建脚本CustomScriptTemplate.cs

using UnityEngine;
using System.IO;
 
public class CustomScriptTemplate : UnityEditor.AssetModificationProcessor
{
    /// <summary>  
    /// 此函数在asset被创建完,文件已经生成到磁盘上,但是没有生成.meta文件和import之前被调用  
    /// </summary>  
    /// <param name="newFileMeta">newfilemeta 是由创建文件的path加上.meta组成的</param>  
    public static void OnWillCreateAsset(string newFileMeta)
    {
        string newFilePath = newFileMeta.Replace(".meta", "");
        string fileExt = Path.GetExtension(newFilePath);
        if (fileExt != ".cs")
        {
            return;
        }
        //注意,Application.datapath会根据使用平台不同而不同  
        string realPath = Application.dataPath.Replace("Assets", "") + newFilePath;
        string scriptContent = File.ReadAllText(realPath);
 
        //这里实现自定义的一些规则  
        scriptContent = scriptContent.Replace("#SCRIPTNAME#", Path.GetFileName(newFilePath));
        scriptContent = scriptContent.Replace("#CompanyName#", "CompanyName");
        scriptContent = scriptContent.Replace("#Author#", "WangDouDou");
        scriptContent = scriptContent.Replace("#Version#", "1.0");
        scriptContent = scriptContent.Replace("#UnityVersion#", Application.unityVersion);
        scriptContent = scriptContent.Replace("#CreateTime#", System.DateTime.Now.ToString("yyyy-MM-dd-HH:mm:ss"));
 
        File.WriteAllText(realPath, scriptContent);
    }
}

参考资料

https://www.twblogs.net/a/5b8c62db2b71771883327863/?lang=zh-cn

https://codeantenna.com/a/f7aoLrjFNm

unity-script-templates

Add your own templates

标签:string,自定义,System,Replace,scriptContent,Unity,using,模板
From: https://www.cnblogs.com/ZTianming/p/16977360.html

相关文章

  • Unity中实现A*寻路
    前言:最近没事儿没工作,计划每天写一篇博客,防止对Unity生疏,也可以记录学习的点点滴滴。A*寻路在很多面试里都会问到,但实际工作中根本用不着自己写,网上有成熟的插件,不容易错......
  • Unity 脚本基础
    Unity官方手册是最好的教程书,只是偶尔限于冗长ScriptingconceptsAlthoughUnityusesanimplementationofthestandardMonoruntimeforscripting,itstillh......
  • 我的机器学习和深度学习绘图模板.pptx
    推荐一个绘图模板,非常适合深度学习的绘图,可以看下效果:大家可以自定义自己需要的图形,上面已经提供了基本的元素,根据自己的需求去调整使用即可!这个项目地址为:https://github.c......
  • 使用Markdown在写博客的一些模板
    模板一(笔记类模板)写在前面用​​Markdown​​​写博客一年多了,最开始是用富文本写,后来发现​​Markdown​​​更适合我,而且​提供了导入导出的功能,图片可以云存储,所以导出......
  • [SIGMOD 2022]DMCS Density Modularity based Community Search
    [SIGMOD2022]DMCS:DensityModularitybasedCommunitySearch介绍目标是找到含有查询点的社区。文章的切入点是高质量的社区一定也是高模块化的,及社区内密度高,且社......
  • 自定义分页器
    自定义分页器目录自定义分页器1、分页推导2、分页器代码封装1、分页推导queryset对象支持切片操作确定用户访问的页码url?page=1current_page=request.GET.......
  • 博奥智源科技,实验室官方网站功能模板分享
    首页需进行版式设计,满足业务部门建设使用需求。不限于:图片比例支持1920*900;需支持不固定条数滚动;需支持搜索功能,以及导航目录的修改和页面设计;需支持全站、全时间段......
  • 模板方法模式
    1.概述定义一个操作中的算法的骨架,而将步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义算法的某些特定步骤。2.模式中的角色2.1抽象类(Ab......
  • Ansible最佳实践之 AWX 启用facts缓存和模板问卷调查
    写在前面分享一些AWX启用facts缓存和模板问卷调查的笔记博文内容涉及:启动facts缓存相关配置Demo启用模板调查来设置变量demo食用方式:需要了解Ansible理解不足小伙伴......
  • DataGear 制作自定义柱状图条目颜色的数据可视化看板
    DataGear看板提供了dg-chart-options图表选项配置功能,可自定义样式、位置、显示内容等图表选项,其中的processUpdateOptions回调函数配置项,可以在图表更新数据前以编程方式......