最新文章
Cocos2d-x游戏开发实例详解7:对象释放时机
03-25 13:59
Cocos2d-x游戏开发实例详解6:自动释放池
03-25 13:55
Cocos2d-x游戏开发实例详解5:神奇的自动释放
03-25 13:49
Cocos2d-x游戏开发实例详解4:游戏主循环
03-25 13:44
Cocos2d-x游戏开发实例详解3:无限滚动地图
03-25 13:37
Cocos2d-x游戏开发实例详解2:开始菜单续
03-25 13:32
unity 设置 layer 代码
在项目开发过程中,我们可能会自定义一些 Tag 和 Layer。然而,当将项目打包成 unitypackage 并导入到一个新建项目时,自定义的 Tag 和 Layer 往往会丢失。本文将为大家介绍如何在导入 unitypackage 时,将自定义的 Tag 或 Layer 写入用户的项目中。
下面直接给出实现代码:
using System;
using System.Collections;
using System.Reflection;
using UnityEditor;
using UnityEngine;
public class NewBehaviourScript : AssetPostprocessor
{
static void OnPostprocessAllAssets(string[] importedAssets, string[] deletedAssets, string[] movedAssets, string[] movedFromAssetPaths)
{
foreach (string s in importedAssets)
{
if (s.Equals("Assets/NewBehaviourScript.cs"))
{
// 增加一个叫 momo 的 tag
AddTag("momo");
// 增加一个叫 ruoruo 的 layer
AddLayer("ruoruo");
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;
}
}
代码解释
OnPostprocessAllAssets方法:这是一个静态方法,会在所有资源导入、删除、移动操作完成后被调用。在该方法中,我们遍历所有导入的资源,如果发现导入的资源是Assets/NewBehaviourScript.cs,则调用AddTag和AddLayer方法添加自定义的 Tag 和 Layer。AddTag方法:该方法用于添加自定义的 Tag。首先检查该 Tag 是否已经存在,如果不存在,则通过SerializedObject和SerializedProperty来操作ProjectSettings/TagManager.asset文件,找到第一个空的 Tag 位置并将自定义的 Tag 写入。AddLayer方法:该方法用于添加自定义的 Layer。同样先检查该 Layer 是否已经存在,如果不存在,则通过SerializedObject和SerializedProperty来操作ProjectSettings/TagManager.asset文件,找到第一个空的用户 Layer 位置并将自定义的 Layer 写入。isHasTag方法:该方法用于检查指定的 Tag 是否已经存在于项目中。通过遍历UnityEditorInternal.InternalEditorUtility.tags数组来判断。isHasLayer方法:该方法用于检查指定的 Layer 是否已经存在于项目中。通过遍历UnityEditorInternal.InternalEditorUtility.layers数组来判断。
通过以上代码,我们可以在导入 unitypackage 时自动添加自定义的 Tag 和 Layer,避免了手动添加的繁琐过程。