Unity代码设置Tag或Layer

  • 描述
  • 代码
  • 注意

描述

Unity中设置Tag和Layer的方法,大家都知道,步骤较为繁琐。有时将一些代码复用到其他项目时,经常会出现Tag或Layer,不存在或找不到的情况。我便找到了这几个通过代码添加Tag和Layer的方法。
一种是通过SerializedObject类序列化物体,来设置Tag和Layer;另一种是通过InternalEditorUtility类直接设置Tag。

代码

using UnityEditor;
using UnityEditorInternal;
using UnityEngine;/// <summary>
/// 添加设置Tag或Layer
/// </summary>
public class AddTagOrLayer
{/// <summary>/// 添加或者创建新的标签/// </summary>/// <param name="tag">标签名</param>/// <param name="obj">需要添加的对象</param>public static void AddOrCreateMyNewTag(string tag, GameObject obj){if (isHasTag(tag)){obj.tag = tag;}else{SerializedObject tagManager = new SerializedObject(obj);//序列化物体SerializedProperty it = tagManager.GetIterator();//序列化属性while (it.NextVisible(true))//下一属性的可见性{if (it.name == "m_TagString"){//Debug.Log(it.stringValue);it.stringValue = tag;tagManager.ApplyModifiedProperties();}}}}/// <summary>/// 添加或者创建新的标签/// </summary>/// <param name="tag">标签名</param>/// <param name="obj">需要添加的对象</param>public static void AddOrCreateNewTag(string tag, GameObject obj){if (!isHasTag(tag)){InternalEditorUtility.AddTag(tag);}obj.tag = tag;}/// <summary>/// 是否有标签/// </summary>/// <param name="tag">标签名</param>/// <returns>判断结果</returns>public static bool isHasTag(string tag){string[] tags = InternalEditorUtility.tags;for (int i = 0; i < tags.Length; i++){if (tags[i].Equals(tag))return true;}return false;}/// <summary>/// 添加或者创建新的层标记/// </summary>/// <param name="layer">标记层名</param>/// <param name="obj">需要添加的对象</param>public static void AddOrCreateMyNewLayer(string layer, GameObject obj){if (!isHasLayer(layer)){SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/Tagmanager.asset"));SerializedProperty it = tagManager.GetIterator();while (it.NextVisible(true)){if (it.name == "layers"){for (int i = 8; i < it.arraySize; i++){SerializedProperty sp = it.GetArrayElementAtIndex(i);if (string.IsNullOrEmpty(sp.stringValue)){sp.stringValue = layer;tagManager.ApplyModifiedProperties();//Debug.Log("success");break;}}break;}}}obj.layer = LayerMask.NameToLayer(layer);}/// <summary>/// 是否有层标记/// </summary>/// <param name="layer">标记层名</param>/// <returns>判断结果</returns>public static bool isHasLayer(string layer){string[] layers = InternalEditorUtility.layers;for (int i = 0; i < layers.Length; i++){if (layers[i].Contains(layer))return true;}return false;}
}

注意

该脚本由于引用了UnityEditor和UnityEditorInternal命名空间内的类,需要放在Editor文件夹下,项目才能正常打包。也因此该类也必须由在Editor文件夹下的脚本引用,例如CustomEditor的脚本编辑器脚本。

using System.Collections.Generic;
using UnityEngine;
using UnityEditor;// 自定义编辑器脚本
[CustomEditor(typeof(Part)), CanEditMultipleObjects]
// 这意思就是此脚本为Part脚本的编辑器脚本,CanEditorMutipleObjects 顾名思义,可以同时编辑多个物体
public class PartEditor : Editor
{protected SerializedProperty scriptProp;private Part m_Part;private void OnEnable(){scriptProp = serializedObject.FindProperty("m_Script");m_Part = ((Part)target);AddTagOrLayer.AddOrCreateMyNewTag("test", m_Part.gameObject);}private void Awake(){}public override void OnInspectorGUI(){//base.OnInspectorGUI();serializedObject.Update();serializedObject.ApplyModifiedProperties();}public override bool HasPreviewGUI(){return base.HasPreviewGUI();}void OnSceneGUI(){}
}

Unity代码添加设置Tag或Layer相关推荐

  1. 【Unity3D】使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )

    文章目录 一.向 Unity 中添加 FBX 模型 二.向 Scene 场景中添加 FBX 模型 三.3D 物体渲染 四.3D 物体材质设置 一.向 Unity 中添加 FBX 模型 Unity 中使 ...

  2. Unity碰撞体不碰撞以及代码添加EventTrigger事件

    文章目录 前言 一.同类型物体的碰撞体不发生碰撞 二.代码控制EventTrigger添加事件 总结 前言 本文所记内容有两点: 一.同类型物体的碰撞体不发生碰撞. 二.代码控制EventTrigge ...

  3. Unity动态添加tag

    1. 做的项目中 需要动态给物体创建一个tag,并添加给物体,但是出现了bug,想要给物体添加tag的话,必须要在编辑器面板中先声明,才可以用代码添加. 2.下面实现了 用代码动态添加tag,不需要先 ...

  4. IOS代码添加控件,控件移动,放大,缩小,旋转

    控件移动,放大,缩小,旋转 1,代码添加控件 例如: [objc] view plaincopy /* 1.创建一个控件 2.设置控件的位置,大小 3.设置控件所需要的各个属性 4.添加入父控件 5. ...

  5. 码云上传代码添加标签_[Android] 发布码云(Gitee)项目到JitPack(最全完整流程)

    最近把github上的代码都转移到了码云上,而且github上的仓库可以很方便的迁移到码云,所以老代码的迁移问题不用考虑. 之前使用 JCenter 发布了一个 GitHub 开源项目,JCenter ...

  6. android10.0(Q) Settings 添加设置项——动态方式

    为什么要这样做? 上一篇通过静态方式添加配置项,应用场景太局限. 所以继续研究加载原理,终于发现了动态加载的奥秘. 效果图 文件清单 frameworks\base\packages\Settings ...

  7. unity代码 获取dropdown_Unity3D UGUI下拉菜单/Dropdown组件用法、总结

    Unity3D中UGUI实现下拉菜单 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar - ...

  8. Unity 代码编写 自定义模型

    Unity 代码编写 自定义模型 目录 Unity 代码编写 自定义模型 代码编写 自定义模型(Cube) 代码编写 自定义模型(Plane) 代码很简单没有难度, Plane 模块和 Cube 还是 ...

  9. Unity项目添加广告,内购测试并上线APP Store

    Ⅰ.添加广告并真机测试 1.用示例广告ID演示Admob Unity 插件 参考(admob官方文字教程) 导入插件包 设置Admob应用ID 示例广告id(测试时务必用示例广告id) 注意导出的ap ...

最新文章

  1. 【2020/6/24整理版】利用csi tool获取csi数据并进行数据解析----适合初学的小白
  2. 人工智能行业有哪些岗位_建筑行业年薪超50万,哪些岗位有希望达到?你是什么岗位呢?昆山建造师培训学校...
  3. python中处理日期和时间的标准模块是-Python time模块参考手册
  4. 2019-10-27 控制领域期刊介绍
  5. 软件工程概论 课堂练习【空调维修系统 类图】
  6. boost::gil::view_is_mutable用法的测试程序
  7. (JAVA)Object类之Scanner
  8. [转载]网页栅格系统研究(3):粒度问题
  9. 小米再回应造车传闻:一直关注,还没正式立项
  10. 通俗易懂的生产环境Web应用架构介绍
  11. C++ machine code与随机数 进阶习题
  12. =====BJmeter性能测试小接=====
  13. Unix网络-select
  14. Cadence Gerber文件制作过程
  15. 爬虫:信息提取的一般方法
  16. ArcGIS制图学习(1)
  17. Android 编译系统之Android.bp
  18. 协助医学未来的10项有前途的技术
  19. PhiloGL学习(6)——深情奉献:快乐的一家
  20. 利用MsChart控件绘制多曲线图表 z

热门文章

  1. IAST 在去哪儿 Q-SDL 体系中的应用
  2. 华为欧拉系统的网络问题
  3. gitbook 快速入门
  4. manjaro 折腾总结
  5. 在路上:安全公司“跨界”SD-WAN
  6. 《北京爱情故事》:四个女人的爱情
  7. 前端动画——网页时钟
  8. 顶刊数据:三批“智慧城市“”试点名单匹配。全国300直辖市地级市智慧城市试点、最早试点年份(2000-2021年)
  9. 【总结】放电管知识大全,看过这篇你都了解了
  10. 企业中多分支多人协作的git工作流程