Unity代码添加设置Tag或Layer
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相关推荐
- 【Unity3D】使用 FBX 格式的外部模型 ( 向 Unity 中添加 FBX 模型 | 向 Scene 场景中添加 FBX 模型 | 3D 物体渲染 | 3D 物体材质设置 )
文章目录 一.向 Unity 中添加 FBX 模型 二.向 Scene 场景中添加 FBX 模型 三.3D 物体渲染 四.3D 物体材质设置 一.向 Unity 中添加 FBX 模型 Unity 中使 ...
- Unity碰撞体不碰撞以及代码添加EventTrigger事件
文章目录 前言 一.同类型物体的碰撞体不发生碰撞 二.代码控制EventTrigger添加事件 总结 前言 本文所记内容有两点: 一.同类型物体的碰撞体不发生碰撞. 二.代码控制EventTrigge ...
- Unity动态添加tag
1. 做的项目中 需要动态给物体创建一个tag,并添加给物体,但是出现了bug,想要给物体添加tag的话,必须要在编辑器面板中先声明,才可以用代码添加. 2.下面实现了 用代码动态添加tag,不需要先 ...
- IOS代码添加控件,控件移动,放大,缩小,旋转
控件移动,放大,缩小,旋转 1,代码添加控件 例如: [objc] view plaincopy /* 1.创建一个控件 2.设置控件的位置,大小 3.设置控件所需要的各个属性 4.添加入父控件 5. ...
- 码云上传代码添加标签_[Android] 发布码云(Gitee)项目到JitPack(最全完整流程)
最近把github上的代码都转移到了码云上,而且github上的仓库可以很方便的迁移到码云,所以老代码的迁移问题不用考虑. 之前使用 JCenter 发布了一个 GitHub 开源项目,JCenter ...
- android10.0(Q) Settings 添加设置项——动态方式
为什么要这样做? 上一篇通过静态方式添加配置项,应用场景太局限. 所以继续研究加载原理,终于发现了动态加载的奥秘. 效果图 文件清单 frameworks\base\packages\Settings ...
- unity代码 获取dropdown_Unity3D UGUI下拉菜单/Dropdown组件用法、总结
Unity3D中UGUI实现下拉菜单 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人! (拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar - ...
- Unity 代码编写 自定义模型
Unity 代码编写 自定义模型 目录 Unity 代码编写 自定义模型 代码编写 自定义模型(Cube) 代码编写 自定义模型(Plane) 代码很简单没有难度, Plane 模块和 Cube 还是 ...
- Unity项目添加广告,内购测试并上线APP Store
Ⅰ.添加广告并真机测试 1.用示例广告ID演示Admob Unity 插件 参考(admob官方文字教程) 导入插件包 设置Admob应用ID 示例广告id(测试时务必用示例广告id) 注意导出的ap ...
最新文章
- 【2020/6/24整理版】利用csi tool获取csi数据并进行数据解析----适合初学的小白
- 人工智能行业有哪些岗位_建筑行业年薪超50万,哪些岗位有希望达到?你是什么岗位呢?昆山建造师培训学校...
- python中处理日期和时间的标准模块是-Python time模块参考手册
- 2019-10-27 控制领域期刊介绍
- 软件工程概论 课堂练习【空调维修系统 类图】
- boost::gil::view_is_mutable用法的测试程序
- (JAVA)Object类之Scanner
- [转载]网页栅格系统研究(3):粒度问题
- 小米再回应造车传闻:一直关注,还没正式立项
- 通俗易懂的生产环境Web应用架构介绍
- C++ machine code与随机数 进阶习题
- =====BJmeter性能测试小接=====
- Unix网络-select
- Cadence Gerber文件制作过程
- 爬虫:信息提取的一般方法
- ArcGIS制图学习(1)
- Android 编译系统之Android.bp
- 协助医学未来的10项有前途的技术
- PhiloGL学习(6)——深情奉献:快乐的一家
- 利用MsChart控件绘制多曲线图表 z