当前位置: 首页 > news >正文

Unity | Tag、Layer常量类生成工具

        在项目开发中我们可以对诸如Layer、Tag等编辑器数据进行常量生成,来代替在代码中通过输入字符串生成常量的形式以提高开发效率。

        Layer的生成可以通过LayerMask.LayerToName获取层名称(也可以从TagManager.asset中获得 ),Tag的生成可以手动将预制Tag标签写入常量列表,其他的自定义Tag可以从TagManager.asset中获得。

一、基本知识

1.unity预制Tag标签

        TagManager.asset文件如下方所示。unity预制的Tag标签(如Respawn、Finish、EditorOnly等6个Tag)并没有在TagManager.asset文件中。

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!78 &1
TagManager:
  serializedVersion: 2
  tags:
  - Test
  layers:
  - Default
  - TransparentFX
  - Ignore Raycast
  - 
  - Water
  - UI
  - TestLayer
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  - 
  m_SortingLayers:
  - name: Default
    uniqueID: 0
    locked: 0

2.Layer层

        在Unity中,Layer机制是固定的,最多只能有32个Layer。这是由Unity的底层设计决定的,因为Layer是用一个32位的整型来表示的,每一位表示一个Layer。

二、工具

using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;

public class LayerManager : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var sb = new StringBuilder();                         //准备模板生成
        sb.AppendLine("public class _Const");
        sb.AppendLine("{");

        for (int i = 0; i < 32; i++)                         //遍历所有Layer
        {
            var name = LayerMask.LayerToName(i);     //通过Unity的接口拿到Layer名称
            name = name
                .Replace(" ", "_")
                .Replace("&", "_")
                .Replace("/", "_")
                .Replace(".", "_")
                .Replace(",", "_")
                .Replace(";", "_")
                .Replace("%", "_")
                .Replace("-", "_");                              //对常见的特殊字符进行过滤
            Debug.Log(name);
            if (!string.IsNullOrEmpty(name))
                sb.AppendFormat("\tpublic const int LAYER_{0} = {1};\n", name.ToUpper(), i);
        }
        sb.AppendLine("\tpublic const string " + ("Tag_Untagged".ToUpper() + " = " + "\"Untagged\";"));
        sb.AppendLine("\tpublic const string " + ("Tag_Respawn".ToUpper() + " = " + "\"Respawn\";"));
        sb.AppendLine("\tpublic const string " + ("Tag_Finish".ToUpper() + " = " + "\"Finish\";"));
        sb.AppendLine("\tpublic const string " + ("Tag_EditorOnly".ToUpper() + " = " + "\"EditorOnly\";"));
        sb.AppendLine("\tpublic const string " + ("Tag_MainCamera".ToUpper() + " = " + "\"MainCamera\";"));
        sb.AppendLine("\tpublic const string " + ("Tag_Player".ToUpper() + " = " + "\"Player\";"));
        sb.AppendLine("\tpublic const string " + ("Tag_GameController".ToUpper() + " = " + "\"GameController\";"));                    //把一部分内置Tag先写死
        var asset = UnityEditor.AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset");                                        //取得自定义Tag
        if ((asset != null) && (asset.Length > 0))
        {
            Debug.Log(asset.Length);
            for (int i = 0; i < asset.Length; i++)
            {
                //创建序列化对象
                var so = new UnityEditor.SerializedObject(asset[i]);
                var tags = so.FindProperty("tags");          //读取具体字段
                for (int j = 0; j < tags.arraySize; ++j)
                {
                    var item = tags.GetArrayElementAtIndex(j).stringValue;
                    sb.AppendFormat("\tpublic const string TAG_{0} = \"{1}\";\n", item.ToUpper(), item);
                }                                                       //添加到模板

                //获取Layer的方法二
                // var layers = so.FindProperty("layers");
                // for (int j = 0; j < layers.arraySize; ++j)
                // {
                //     var item = layers.GetArrayElementAtIndex(j).stringValue;
                //     if (!string.IsNullOrEmpty(item))
                //         sb.AppendFormat("\tpublic const int LAYER_{0} = {1};\n", item.ToUpper(), j);
                // }
            }
        }
        sb.AppendLine("}");
        File.WriteAllText("Assets/GeneratedConst.cs", sb.ToString());     //写入硬盘
        UnityEditor.AssetDatabase.Refresh();               //通知Unity刷新
    }

}

三、生成的代码

public class _Const
{
	public const int LAYER_DEFAULT = 0;
	public const int LAYER_TRANSPARENTFX = 1;
	public const int LAYER_IGNORE_RAYCAST = 2;
	public const int LAYER_WATER = 4;
	public const int LAYER_UI = 5;
	public const int LAYER_TESTLAYER = 6;
	public const string TAG_UNTAGGED = "Untagged";
	public const string TAG_RESPAWN = "Respawn";
	public const string TAG_FINISH = "Finish";
	public const string TAG_EDITORONLY = "EditorOnly";
	public const string TAG_MAINCAMERA = "MainCamera";
	public const string TAG_PLAYER = "Player";
	public const string TAG_GAMECONTROLLER = "GameController";
	public const string TAG_TEST = "Test";
}

 

相关文章:

  • Kerberos协议工作原理介绍
  • springmvc中,Filter使用
  • 探秘Transformer系列之(16)--- 资源占用
  • 如何在Spring Boot中设置HttpOnly Cookie以增强安全性
  • eclipse [jvm memory monitor] SHOW_MEMORY_MONITOR=true
  • WEB攻防- PHP反序列化属性权限特征原生类 TIPS字符串逃逸CVE 绕过漏洞
  • PostgreSQL_数据回退,数据库导出、导入
  • UI自动化测试往往在功能测试之后进行的核心原因
  • 前端技巧第九期JavaScript数据类型
  • 博客图床 VsCode + PicGo + 阿里云OSS,小丑,Github
  • git 设置保存密码 git保存密码
  • 【日志库】—— log4cpp 部署套路
  • [极客大挑战 2019]BabySQL—3.20BUUCTF练习day4(3)
  • 传感器研习社:Swift Navigation与意法半导体(STMicroelectronics)合作 共同推出端到端GNSS汽车自动驾驶解决方案
  • IM项目 ----- 项目部署
  • SZU软件工程大学生涯 2022~2026
  • 语言大模型之BERT
  • Java 大视界 -- Java 大数据中的知识图谱可视化与交互分析技术(141)
  • 数据库面试题一
  • 开箱即用:免费的数据库管理平台 NineData 社区版
  • 澳大利亚首例“漂绿”诉讼开庭:能源巨头因“碳中和”承诺遭起诉
  • 华东政法与复旦上医签署合作框架协议,医学与法学如何交叉融合?
  • 鄂州交警通报致1死2伤车祸:女子操作不当引发,已被刑拘
  • 西北大学副校长成陕西首富?旗下巨子生物去年净利超20亿,到底持股多少
  • 孙简任吉林省副省长
  • 佩斯科夫:若普京认为必要,将公布土耳其谈判俄方代表人选