unity--unitypackage自动添加tag和Layer

有朋友问我他做了一个unity游戏插件,但是它的插件里面自定义了自己的tag和layer。这样用户在导入他的unitypackage的时候如果项目里没有写入它的tag或者layer那么就会有错误,所以他希望在导入unitypackage的时候自定把它的tag或者layer写进用户的项目里。

把下面这条脚本,随着你的资源一起打包,这样当你的unitypackage被别人导入的时候,程序就会调用AddTag和AddLayer来添加。因为有可能你的项目里已经添加了这个tag或者layer所以在添加之前我做了一个判断,判断项目是否已经存在了这个tag。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class autoAddTagAndLayer : AssetPostprocessor

{

    static void OnPostprocessAllAssets (string[] importedAssets, string[] deletedAssets,string[] movedAssets, string[] movedFromAssetPaths)
    {
        foreach(string s in importedAssets)
        {
            if (s.Equals("Assets/autoAddTagAndLayer.cs"))
            {
                //增加一个你自己的tag,比如:pm
                AddTag("pm");
                //增加一个你的的layer,比如:wall
                AddLayer("wall");
                return ;
            }
        }  
    }

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

    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.StartsWith("User Layer"))
                {
                    if(it.type == "string" )
                    {
                        if(string.IsNullOrEmpty(it.stringValue)){
                            it.stringValue  = layer;
                            tagManager.ApplyModifiedProperties();
                            return;
                        }
                    }
                }
            }
        }
    }

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

    static bool isHasLayer(string layer)
    {
        for (int i = 0; i < UnityEditorInternal.InternalEditorUtility.layers.Length; i++) {
            if (UnityEditorInternal.InternalEditorUtility.layers[i].Contains(layer))
                return true;
        }

        return false;
    }
}
 

OK然后就是导入你的unitypackage

倒入完毕后,新增加的tag和layer就都保存进去了。

 

 

 

 

  • 本文固定链接: https://www.xuanyusong.com/archives/3169

你可能感兴趣的:(Unity)