查看: 2529|回复: 1
打印 上一主题 下一主题

[经验分享] Unity3D研究院之脚本自动添加tag和Layer

[复制链接]

2

主题

0

听众

704

积分

初级设计师

Rank: 3Rank: 3

纳金币
261
精华
0

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

跳转到指定楼层
楼主
发表于 2014-9-24 16:13:11 |只看该作者 |倒序浏览
雨松MOMO 【Unity杂文】 围观696次 4条评论 编辑日期:2014-09-04 字体:大 中 小

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

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

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.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.Contains(layer))
                return true;
        }
        return false;
    }
}
OK然后就是导入你的unitypackage

unity3d研究院之脚本自动添加tag和Layer - 雨松MOMO程序研究院 - 1

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

Unity3D研究院之脚本自动添加tag和Layer - 雨松MOMO程序研究院 - 2



代码其实不难,如果你想同时导入多个tag或者layer,简单的拓展一下方法传入不固定参数即可。最近MOMO好累呀!希望痛苦的日子赶快过去。。555555555
分享到: QQ好友和群QQ好友和群 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
转播转播0 分享淘帖0 收藏收藏0 支持支持0 反对反对0
回复

使用道具 举报

2317

主题

54

听众

2万

积分

资深设计师

Rank: 7Rank: 7Rank: 7

纳金币
20645
精华
62

最佳新人 活跃会员 热心会员 灌水之王 突出贡献

沙发
发表于 2014-9-24 16:17:15 |只看该作者
MOMO的文章还行啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

手机版|纳金网 ( 闽ICP备2021016425号-2/3

GMT+8, 2024-11-10 15:19 , Processed in 0.093797 second(s), 31 queries .

Powered by Discuz!-创意设计 X2.5

© 2008-2019 Narkii Inc.

回顶部