iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >Unity给物体添加多个Tag的实现
  • 328
分享到

Unity给物体添加多个Tag的实现

2024-04-02 19:04:59 328人浏览 泡泡鱼
摘要

在Unity中,我们经常通过给物体添加标签来判断这个物体是不是我们想要的 但是unity默认只能添加一个标签,那如果我们要给一个物体添加多个标签应该怎么办 首先,我们定义一个Tag

Unity中,我们经常通过给物体添加标签来判断这个物体是不是我们想要的

但是unity默认只能添加一个标签,那如果我们要给一个物体添加多个标签应该怎么办

首先,我们定义一个Tag.cs类,这个类用来存储物体的tag信息


public class Tags : MonoBehaviour{
    public List<string> tags=new List<string>();
}

然后创建一个单例类TagManager.cs用来管理tag


public class TagManager : MonoBehaviour {
   public static TagManager Instance { get; private set; }
   private void Awake() {
      if (Instance == null) {
         Instance = (TagManager) this;
         DontDestroyOnLoad(gameObject);
      }
      else {
         Destroy(gameObject);
      }
   }
}

TagManager中增加存储tag的list和对应物体的dictionary


public List<string> tagsList = new List<string>();
[ShowInInspector]
public Dictionary<string, List<GameObject>> tagsDictionary = new Dictionary<string, List<GameObject>>();

但是inspector窗口中修改dictionary中的值后,播放时会自动清除数据,所以还要给dictionary赋值


private void InitTags() {
   int length = tagsList.Count;
   tagsDictionary = new Dictionary<string, List<GameObject>>(length);
   for (int i = 0; i < length; i++) {
      tagsDictionary.Add(tagsList[i], new List<GameObject>());
   }
}

然后我们通过在inspector窗口修改list来修改物体的taf

新建一个Extensions.cs,我们在这个类里面写一些扩展方法


public static class Extensions {
   //包含所有的 tag 返回true
   public static bool HasTag(this GameObject gameObject, params string[] tag) {
      if (gameObject.TryGetComponent<Tags>(out Tags t)) {
         for (int i = 0; i < tag.Length; i++) {
            if (!t.tags.Contains(tag[i])) {
               Debug.Log(gameObject.name+"不存在"+tag+"标签");
               return false;
            }
         }
      }
      return true;
   }
   //给物体增加 tag
   public static void AddTag(this GameObject gameObject, params string[] tags) {
      if (gameObject.TryGetComponent<Tags>(out Tags t)) {
         foreach (var tag in tags) {
            if (!TagManager.Instance.tagsList.Contains(tag)) {
               Debug.Log("增加一个tag:" + tag);
               TagManager.Instance.tagsDictionary.Add(tag, new List<GameObject>());
               Debug.Log(tag + "增加一个物体" + gameObject.name);
               TagManager.Instance.tagsDictionary[tag].Add(gameObject);
            }
            else {
               Debug.Log(tag + "增加一个物体" + gameObject.name);
               TagManager.Instance.tagsDictionary[tag].Add(gameObject);
            }
         }
      }
   }
   //给物体删除tag
	public static void RemoveTag(this GameObject gameObject,params string[] tags) {
		for (int i = 0; i < tags.Length; i++) {
			if (gameObject.HasTag(tags[i])) {
				gameObject.GetComponent<Tags>().tags.Remove(tags[i]);
				Debug.Log(gameObject.name+"移除"+tags+"标签");
				TagManager.Instance.tagsDictionary[tags[i]].Remove(gameObject);
			}
			else {
				Debug.LogWarning(gameObject.name+"不存在"+tags[i]+"标签");
			}
		}
	}
}

这样像下面这样直接调用即可


gameObject.AddTag("Player","Tag1");
gameObject.HasTag("Player","Tag1");
gameObject.RemoveTag("Player");

最后TagManager.cs中通过标签获取所有物体


public List<GameObject> FindObjsWithTag(string tag) {
    if (tagsDictionary.ContainsKey(tag)) {
        return tagsDictionary[tag];
    }
    Debug.Log("不存在标签为" + tag + "的物体");
    return null;
}

测试一下

创建两个挂有Tags.cs脚本的物体


public class Tags : MonoBehaviour{
    public List<string> tags=new List<string>();
    void Start() {
        gameObject.AddTag(tags.ToArray());
        gameObject.HasTag("Player");
    }
    void Update(){
        if (Input.GeTKEyDown(KeyCode.A)) {
            gameObject.RemoveTag("Player","tag1");
        }
    }
}

两个物体具有的tag分别为tag1tag2tag1

TagManager只有tag1

运行

但是这样当退出Play模式后,List中的数据会被清空,所以可以使用ScriptableObject进行持久化存储也可以使用Odin等插件直接对字典进行序列化

使用ScriptableObject

新建一个TagsAsset.cs


[CreateAssetMenu]
public class TagsAsset : ScriptableObject{
    public List<string> tags=new List<string>();
}

将原先代码中tagsList相关的代码修改为tagsAsset.tags并修缮一下即可

使用Odin

导入Odin插件,使TagManager继承自SerializedMonoBehaviour


[NonSerialized, OdinSerialize]
public Dictionary<string, List<GameObject>> tagsDictionary = new Dictionary<string, List<GameObject>>();

关于Odin的进阶可以看https://zhuanlan.zhihu.com/p/268324619

到此这篇关于Unity给物体添加多个Tag的实现的文章就介绍到这了,更多相关Unity 物体添加多个Tag内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Unity给物体添加多个Tag的实现

本文链接: https://www.lsjlt.com/news/124587.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Unity给物体添加多个Tag的实现
    在unity中,我们经常通过给物体添加标签来判断这个物体是不是我们想要的 但是unity默认只能添加一个标签,那如果我们要给一个物体添加多个标签应该怎么办 首先,我们定义一个Tag...
    99+
    2024-04-02
  • Unity如何给物体添加多个Tag
    这篇文章主要介绍了Unity如何给物体添加多个Tag,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在unity中,我们经常通过给物体添加标签来判断这个物体是不是我们想要的但是...
    99+
    2023-06-14
  • Unity 实现给物体动态添加事件
    介绍一个方法给物体动态的添加事件(点击 拖拽等) using System.Events; using System.EventSystems; //_go is the gam...
    99+
    2024-04-02
  • 使用Unity怎么给物体动态添加事件
    这篇文章给大家介绍使用Unity怎么给物体动态添加事件,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。using System.Events;using System.EventSystems;//_...
    99+
    2023-06-14
  • Unity 实现给物体替换材质球
    下面先看一下效果图 using UnityEngine; using System.Collections; public class textMesh : MonoBeh...
    99+
    2024-04-02
  • 怎么在Unity中实现给物体替换材质球
    怎么在Unity中实现给物体替换材质球?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。using UnityEngine;using System.Colle...
    99+
    2023-06-14
  • unity实现物体延时出现的方法
    小编给大家分享一下unity实现物体延时出现的方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!新建一个cube和plane,隐藏cube,脚本挂在plane上。...
    99+
    2023-06-14
  • Unity实现物体运动轨迹的绘制
    本文实例为大家分享了unity物体运动轨迹绘制的具体代码,供大家参考,具体内容如下 ① create empty,命名为LineRender ② 在Assects中新建材质,选择Sh...
    99+
    2024-04-02
  • 实例讲解vue怎么实现一个添加购物车投掷物功能
    Vue是一种流行的JavaScript框架,因其易用性和灵活性而备受欢迎。在本文中,我们将探讨如何在Vue中实现抛物线效果,以使用户在添加商品到购物车时获得更好的使用体验。引入抛物线插件为了实现投出物效果,我们可以使用vue-beautif...
    99+
    2023-05-14
  • unity实现鼠标经过时ui及物体的变色操作
    1、实现UI的变色 设置Highlighted Color为鼠标经过时变的颜色(Normal为常态,Pressed为按下时的颜色,Disabled为禁止的颜色) 2、通过代码实现物...
    99+
    2024-04-02
  • JAVA动态给实体类添加属性的方法是什么
    在Java中,实体类是指用于表示现实世界中的实体的类。一般情况下,实体类的属性是在类的定义中固定的,无法动态添加。然而,可以使用Ja...
    99+
    2023-10-18
    JAVA
  • SpringBoot2.x实现给Controller的RequestMapping添加统一前缀
    目录给Controller的RequestMapping添加统一前缀总结一下有几个方法springboot项目添加全局前缀spring的配置springboot的配置给Control...
    99+
    2024-04-02
  • elementui的select实现多选添加功能
    select组件 <el-col :span="12"> <el-form-item label="成员" prop="person">...
    99+
    2023-03-22
    elementui的select多选添加 elementui的select多选
  • 如何实现批处理添加多个新的域名到hosts
    这篇文章主要讲解了“如何实现批处理添加多个新的域名到hosts”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现批处理添加多个新的域名到hosts”吧!要求:批处理(.bat) 添加多个...
    99+
    2023-06-08
  • 如何使用unity实现鼠标经过时ui及物体的变色操作
    这篇文章主要介绍了如何使用unity实现鼠标经过时ui及物体的变色操作,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1、实现UI的变色设置Highlighted Color为...
    99+
    2023-06-14
  • iOS中给UITableView的侧滑删除增加多个按钮的实现方法
    一. 需求: cell的侧滑删除默认只有一个删除按钮, 给侧滑添加多个按钮, '删除', '置顶', '更多'. 二. 实现说明:1) 我们在使用一些应用的时候,在滑动一些联系人的某一行的时候,会出现删除、置顶、更多等等的按钮,在...
    99+
    2023-05-31
    ios uitableview 侧滑删除
  • Vue一个动态添加background-image的实现
    目录Vue一个动态添加background-imageVue踩坑background-image路径结合实际情况,处理方法如下扩展:图片格式(base64)总结Vue一个动态添加ba...
    99+
    2023-03-11
    Vue动态添加 Vue background-image Vue添加background-image
  • Unity使用物理引擎实现多旋翼无人机的模拟飞行
    内容简介 最近在用Unity实现无人机的模拟飞行,但发现站里基本没有完整介绍如何实现该功能的博客,因时间紧迫,就自己简单做了一个仿真(不是完全按照现实物理情景来做,即通过各个螺旋桨旋...
    99+
    2024-04-02
  • SpringBoot多controller添加URL前缀的实现方法
    目录前言一、配置文件内添加前缀配置二、配置映射的实体三、自定义注解四、自定义PathMatch添加前缀五、测试前言 在某些情况下,服务的controller中前缀是一致的,例如所有U...
    99+
    2023-02-15
    SpringBoot多controller添加URL前缀 SpringBoot添加URL前缀
  • OpenCV自动给图片添加彩虹特效的实现示例
    目录背景介绍 实现步骤【1】准备一张夏季风景图片,加载读取【2】创建一张与原图同样大小的黑图,然后通过画椭圆函数绘制彩虹【3】高斯模糊,让彩虹边缘更柔和过渡【4】彩虹图像与风景图混合...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作