热门标签 | 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的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 个人学习使用:谨慎参考1Client类importcom.thoughtworks.gauge.Step;importcom.thoughtworks.gauge.T ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • Python SQLAlchemy库的使用方法详解
    本文详细介绍了Python中使用SQLAlchemy库的方法。首先对SQLAlchemy进行了简介,包括其定义、适用的数据库类型等。然后讨论了SQLAlchemy提供的两种主要使用模式,即SQL表达式语言和ORM。针对不同的需求,给出了选择哪种模式的建议。最后,介绍了连接数据库的方法,包括创建SQLAlchemy引擎和执行SQL语句的接口。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • springmvc学习笔记(十):控制器业务方法中通过注解实现封装Javabean接收表单提交的数据
    本文介绍了在springmvc学习笔记系列的第十篇中,控制器的业务方法中如何通过注解实现封装Javabean来接收表单提交的数据。同时还讨论了当有多个注册表单且字段完全相同时,如何将其交给同一个控制器处理。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
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社区 版权所有