Unity中通过代码添加Layer层和Tag层

本文介绍了一种在Unity中自动添加Tag和Layer的方法,解决了导入Package后需手动设置的问题。通过代码实现物体Layer的精确匹配,避免了层级名称不一致导致的错误。适用于不同Unity版本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在导入别人的package包的时候,tag信息和layer信息导不进来。还得手动一个个添加,一个个设置。很是麻烦。

在网上看了一下别人写的添加layer层的文章,但是里面的代码已经不适合现在版本的unity了。像雨松MOMO

Unity3D研究院之脚本自动添加tag和Layer。这给unity版本很早了。整合了一下各种版本,测试可以使用,代码如下:

场景中的物体的layer 需要用代码去设置。不然即使layer添加进去了,但是有可能出现匹配不正确。而Tag值则不会出现这个问题。

思考了一下,unity 在匹配Tag值得时候,是遍历TagList,找到对应的Tag设置。而unity在设置Layer层的时候,则是通过层级来设置的,即使你层级里面对应的名字不正确。 所以最好是通过代码设置物体的layer层级。

 private static string[] _testLayerArr = { "LayerOne", "LayerTwo", "LayerThree" };
    private static string[] _testTagArr = { "TagOne", "TagTwo", "TagThree" };

    private static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
    {
        foreach (string s in importedAssets)
        {
            if (s.Equals("Assets/Test/LayerTest/ExportLayer.cs"))
            {
                foreach (string tag in _testTagArr)
                {
                    AddTag(tag);
                }
                foreach (string layer in _testLayerArr)
                {
                    AddLayer(layer);
                    
                }
                return;
            }
        }
    }  

    static bool IsHasLayer(string 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 = 0; i < it.arraySize; i++)
                {
                    SerializedProperty sp = it.GetArrayElementAtIndex(i);
                    if (!string.IsNullOrEmpty(sp.stringValue))
                    {
                        if (sp.stringValue.Equals(layer))
                        {
                            sp.stringValue = string.Empty;
                            tagManager.ApplyModifiedProperties();
                        }
                    }
                }
            }
        }
        for (int i = 0; i < UnityEditorInternal.InternalEditorUtility.layers.Length; i++)
        {
            if (UnityEditorInternal.InternalEditorUtility.layers[i].Contains(layer))
                return true;
        }
        return false;
    }

    static bool IsHasTag(string tag)
    {
        for (int i = 0; i < UnityEditorInternal.InternalEditorUtility.tags.Length; i++)
        {
            if (UnityEditorInternal.InternalEditorUtility.tags[i].Contains(tag))
                return true;
        }
        return false;
    }

    /// <summary>
    /// 添加layer
    /// </summary>
    /// <param name="layer"></param>
    private static void AddLayer(string layer)
    {
        if (!IsHasLayer(layer))
        {
            SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
            SerializedProperty it = tagManager.GetIterator();
            while (it.NextVisible(true))
            {
                if (it.name == "layers")
                {
                    for (int i = 0; i < it.arraySize; i++)
                    {
                        if (i == 3||i==6||i==7)
                        {
                            continue;
                        }
                        SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
                        if (string.IsNullOrEmpty(dataPoint.stringValue)) 
                        {
                            dataPoint.stringValue = layer;
                            tagManager.ApplyModifiedProperties();
                            return;
                        }
                    }
                }              
            }
        }
    }

    /// <summary>
    /// 添加tag
    /// </summary>
    /// <param name="tag"></param>
    private static void AddTag(string tag)
    {
        if (!IsHasTag(tag))
        {
            SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
            SerializedProperty it = tagManager.GetIterator();
            while (it.NextVisible(true))
            {
                if (it.name == "tags")
                {
                    for (int i = 0; i < it.arraySize; i++)
                    {
                        SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
                        if (string.IsNullOrEmpty(dataPoint.stringValue))
                        {
                            dataPoint.stringValue = tag;
                            tagManager.ApplyModifiedProperties();
                            return;
                        }
                    }
                }
            }
        }
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值