热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Unity3D之脚本自动添加tag和Layer

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

  有朋友问我他做了一个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
  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
  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
  78.                         if (UnityEditorInternal.InternalEditorUtility.layers[i].Contains(layer))
  79.                                 return true;
  80.                 }
  81.                 return false;
  82.         }
  83. }

OK然后就是导入你的unitypackage



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




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



推荐阅读
  • 本文基于Java官方文档进行了适当修改,旨在介绍如何实现一个能够同时处理多个客户端请求的服务端程序。在前文中,我们探讨了单客户端访问的服务端实现,而本篇将深入讲解多客户端环境下的服务端设计与实现。 ... [详细]
  • 本文探讨了Java中有效停止线程的多种方法,包括使用标志位、中断机制及处理阻塞I/O操作等,旨在帮助开发者避免使用已废弃的危险方法,确保线程安全和程序稳定性。 ... [详细]
  • 本文介绍了一个将 Java 实体对象转换为 Map 的工具类,通过反射机制获取实体类的字段并将其值映射到 Map 中,适用于需要将对象数据结构化处理的场景。 ... [详细]
  • 本文探讨了Android系统中联系人数据库的设计,特别是AbstractContactsProvider类的作用与实现。文章提供了对源代码的详细分析,并解释了该类如何支持跨数据库操作及事务处理。源代码可从官方Android网站下载。 ... [详细]
  • Hadoop MapReduce 实战案例:手机流量使用统计分析
    本文通过一个具体的Hadoop MapReduce案例,详细介绍了如何利用MapReduce框架来统计和分析手机用户的流量使用情况,包括上行和下行流量的计算以及总流量的汇总。 ... [详细]
  • 详解MyBatis二级缓存的启用与配置
    本文深入探讨了MyBatis二级缓存的启用方法及其配置细节,通过具体的代码实例进行说明,有助于开发者更好地理解和应用这一特性,提升应用程序的性能。 ... [详细]
  • Java实现实时更新的日期与时间显示
    本文介绍了如何使用Java编程语言来创建一个能够实时更新显示系统当前日期和时间的小程序。通过使用Swing库中的组件和定时器功能,可以实现界面友好且功能强大的时间显示应用。 ... [详细]
  • 第1章选择流程控制语句1.1顺序结构的基本使用1.1.1顺序结构概述是程序中最简单最基本的流程控制,没有特定的语法结构,按照代码的先后顺序,依次执行,程序中大多数的代码都是这样执行 ... [详细]
  • 使用Java计算两个日期之间的月份数
    本文详细介绍了利用Java编程语言计算两个指定日期之间月份数的方法。文章通过实例代码讲解了如何使用Joda-Time库来简化日期处理过程,旨在为开发者提供一个高效且易于理解的解决方案。 ... [详细]
  • 本文探讨了如何利用 Android 的 Movie 类来展示 GIF 动画,并详细介绍了调整 GIF 尺寸以适应不同布局的方法。同时,提供了相关的代码示例和注意事项。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • Java多线程售票案例分析
    本文通过一个售票系统的实例,深入探讨了Java中的多线程技术及其在资源共享和并发控制中的应用。售票过程涉及查询、收款、找零和出票等多个步骤,其中对总票数的管理尤为关键。 ... [详细]
  • Go语言实现文件读取与终端输出
    本文介绍如何使用Go语言编写程序,通过命令行参数指定文件路径,读取文件内容并将其输出到控制台。代码示例中包含了错误处理和资源管理的最佳实践。 ... [详细]
  • 本文详细介绍了如何使用C#实现不同类型的系统服务账户(如Windows服务、计划任务和IIS应用池)的密码重置方法。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
author-avatar
梦里的天真575
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有