Unity3D之脚本自动添加tag和Layer

时间:2021-06-14 04:09:23

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


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


  1. using System;
  2. using System.Collections;
  3. using System.Reflection;
  4. using UnityEditor;
  5. using UnityEngine;

  6. public class NewBehaviourScript :AssetPostprocessor
  7. {

  8.         static void OnPostprocessAllAssets (string[] importedAssets, string[] deletedAssets,string[] movedAssets, string[] movedFromAssetPaths) 
  9.         {
  10.                 foreach(string s in importedAssets)
  11.                 {
  12.                         if (s.Equals("Assets/NewBehaviourScript.cs"))
  13.                         {
  14.                                 //增加一个叫momo的tag
  15.                                 AddTag("momo");
  16.                                 //增加一个叫ruoruo的layer
  17.                                 AddLayer("ruoruo");
  18.                                 return ;
  19.                         }
  20.                 }   
  21.         }

  22.         static void AddTag(string tag)
  23.         {
  24.                 if(!isHasTag(tag))
  25.                 {
  26.                         SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
  27.                         SerializedProperty it = tagManager.GetIterator();
  28.                         while (it.NextVisible(true))
  29.                         {
  30.                                 if(it.name == "tags")
  31.                                 {
  32.                                         for (int i = 0; i < it.arraySize; i++) 
  33.                                         { 
  34.                                                 SerializedProperty dataPoint = it.GetArrayElementAtIndex(i);
  35.                                                 if(string.IsNullOrEmpty(dataPoint.stringValue)){
  36.                                                         dataPoint.stringValue = tag;
  37.                                                         tagManager.ApplyModifiedProperties();
  38.                                                         return;
  39.                                                 }
  40.                                         }
  41.                                 }
  42.                         }
  43.                 }
  44.         }

  45.         static void AddLayer(string layer)
  46.         {
  47.                 if(!isHasLayer(layer))
  48.                 {
  49.                         SerializedObject tagManager = new SerializedObject(AssetDatabase.LoadAllAssetsAtPath("ProjectSettings/TagManager.asset")[0]);
  50.                         SerializedProperty it = tagManager.GetIterator();
  51.                         while (it.NextVisible(true))
  52.                         {
  53.                                 if(it.name.StartsWith("User Layer"))
  54.                                 {
  55.                                         if(it.type == "string" )
  56.                                         {
  57.                                                 if(string.IsNullOrEmpty(it.stringValue)){
  58.                                                         it.stringValue  = layer;
  59.                                                         tagManager.ApplyModifiedProperties();
  60.                                                         return;
  61.                                                 }
  62.                                         }
  63.                                 }
  64.                         }
  65.                 }
  66.         }

  67.         static bool isHasTag(string tag)
  68.         {
  69.                 for (int i = 0; i < UnityEditorInternal.InternalEditorUtility.tags.Length; i++) {
  70.                         if (UnityEditorInternal.InternalEditorUtility.tags[i].Contains(tag))
  71.                                 return true;
  72.                 }
  73.                 return false;
  74.         }

  75.         static bool isHasLayer(string layer)
  76.         {
  77.                 for (int i = 0; i < UnityEditorInternal.InternalEditorUtility.layers.Length; i++) {
  78.                         if (UnityEditorInternal.InternalEditorUtility.layers[i].Contains(layer))
  79.                                 return true;
  80.                 }
  81.                 return false;
  82.         }
  83. }
复制代码

OK然后就是导入你的unitypackage


Unity3D之脚本自动添加tag和Layer


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


Unity3D之脚本自动添加tag和Layer



代码其实不难,如果你想同时导入多个tag或者layer,简单的拓展一下方法传入不固定参数即可。