您的位置:首页 > 移动开发 > Unity3D

Unity动态添加Tag

2016-05-23 14:47 931 查看
Tag是Unity非常棒的一样小工具,让我们更轻松地把物体标记,但是很遗憾的一点是,在Unity中所有你想修改的tag都需要事枚举出来:



But,当我们不知道他的tag究竟会是什么,需要动态传入tag的值时,就懵逼了。参考雨松大神的文章,我尝试着去模仿思路,雨松大神的文章,却发现了些问题,不知是大神笔误还是版本问题,我用的是5.2.2f1:

首先,遍历序列化属性中有关Tag的属性名不是“tag”,而是“m_TagString”。我把所有的序列化属性名都打印出来了,如下:


其次,momo大神的这句:



我理解为遍历tag的列表,直到为空也就是最后一个时新建tag,然而,编译器运行会报错:类型是不被支持的string值,打印string的长度是0,不知道什么鬼。然后便回观之前获取的“m_TagString”这个序列化属性,尝试性地直接赋值给他的stringValue值,惊喜得发现,生效了!

^_^



以下给出我修改后的脚本:

using UnityEditor;
using UnityEngine ;
public class addTag:MonoBehaviour
{
public GameObject o;//被修改的物体
void Start(){
AddTag("东方喵",o);
}
//添加tag标签
void AddTag(string tag,GameObject obj)
{
if(!isHasTag(tag))
{
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();
}
}
}
}
bool isHasTag(string tag)
{
for (int i = 0; i < UnityEditorInternal.InternalEditorUtility.tags.Length; i++) {
if (UnityEditorInternal.InternalEditorUtility.tags[i].Equals(tag))
return true;
}
return false;
}
}


然后,我们的小tag就创建出来啦!



特别鸣谢:雨松momo大神的文章提供思路。

欢迎收藏东方喵的博客 http://blog.csdn.net/qq_31794491

东方喵 著
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  tag unity u3d 遍历