Unity에서 코드로 Layer 및 Tag 레이어 추가

5011 단어 Unity
다른 사람의 패키지 패키지를 가져올 때 tag 정보와layer 정보가 들어오지 않습니다.수동으로 하나씩 추가해서 하나씩 설정해야 돼요.귀찮아요.
인터넷에서 다른 사람이 쓴 레이어를 추가한 글을 봤지만 그 안의 코드는 현재 버전의 유닛에 맞지 않는다.우송모모 같아.
의 Unity3D 연구원 스크립트에 tag 및 Layer가 자동으로 추가됩니다.유닛 버전에 일찍 줬어요.다양한 버전이 통합되어 테스트에 사용할 수 있으며 코드는 다음과 같습니다.
장면 속의 물체의layer는 코드로 설정해야 합니다.그렇지 않으면 레이어가 추가되었음에도 불구하고 일치하지 않을 수 있습니다.Tag 값은 이 문제를 일으키지 않습니다.
생각해 보니 유닛이 태그와 일치할 때 TagList를 훑어보고 해당하는 태그 설정을 찾는 것이다.유닛은 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;
    }

    /// 
    ///   layer
    /// 
    /// 
    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;
                        }
                    }
                }              
            }
        }
    }

    /// 
    ///   tag
    /// 
    /// 
    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;
                        }
                    }
                }
            }
        }
    }

좋은 웹페이지 즐겨찾기