转载 雨松mono Unity获取游戏对象详解(来自我的长微博)

 Unity获取游戏对象详解(来自我的长微博)

转载 自 雨松mono

 

 

我觉得Unity里面的Transform 和 GameObject就像两个双胞胎兄弟一样,这俩哥们很要好,我能直接找到你,你也能直接找到我。我看很多人喜欢在类里面去保存GameObject对象。解决GameObject.Find()无法获取天生activie = false的问题。
     private GameObject root ;

我觉得你最好不要保存GameObject ,而是去保存Transform ,因为Transform下的方法要比GameObject多,使用频率也要高很多。

    private Transform root ;

其实我心里一直有个疑问,为什么unity不把GameObject和Transform合并成一个对象。

1.GameObject.Find()

通过场景里面的名子或者一个路径直接获取游戏对象。
    GameObject root = GameObject.Find(“GameObject”);

我觉得如果游戏对象没再最上层,那么最好使用路径的方法,因为有可能你的游戏对象会有重名的情况,路径用“/”符号隔开即可。
    GameObject root = GameObject.Find(“GameObject/Cube”);

GameObject.Find()使用起来很方便,但是它有个缺陷如下图所示,就是如果你的这个GameObject天生acive = false的话。那么你用GameObject.Find()是永远也无法获取它的对象的。如果对象都获取不到,那么对象身上脚本啊 组件啊啥的都是获取不到的,变成了没有意义的对象。

#你好Unity3D#Unity获取游戏对象详解(来自我的长微博) - 雨松MOMO程序研究院 - 1 

就这个问题我查过很多资料,最终也无果。。但是我用另外一个巧妙的办法可以解决它。(后面详解)或者你也可以提前把所有的游戏对象保存在内存中。

GameObject.Find()方法在游戏中的使用频率很高。但是它也很消耗性能,你可以想想它的原理肯定也是用类似递归的形式来做的,那么我们就要尽量更少的调用GameObject.Find()方法,可以把获取的游戏对象,保存在内存里,这是再好不过的选择了。 尤其是在Update方法中不要去 Find()游戏对象!!

2 .Transform.Find()
还记得上面我说过用GameObject无法获取天生acive = false的游戏对象,如果你用Transform.Find()的话就可以很好的获取,另外Unity还提供了一个Transform.FindChind()的方法,这个方法未来会被unity废弃,大家最好就别用了,用Transform.Find()可以取代。

如下代码,我们先获取顶级对象root 。接着用Find()去找它的子节点”xxxx”的对象,无论”xxxx”对象是否active = true 都是可以直接找到对象的。

       

 

Find()方法只能直接去找子节点,如果你想找 孙节点,那么可以用”/“符号把层级关系隔开,找起来很方便。同样无论”xxxx”对象是否active = true 都是可以直接找到对象的。

值得注意的是,unity规定了比如父节点active = true 并且子节点的 active = true 都满足的情况下 才能全部显示。使用Transform.Find()可以很方便的获取游戏对象,因为有了游戏对象,那么它身上的脚本啊组件啊什么的都可以很方便的获取到。

但是Transform.Find()必须要保证你的顶级父对象的activity = true。举个例子,你做了一个场景有一些地图你在场景里面预先activie = false了, 你希望在游戏中的某个时间点把它们都打开 setActive(true)

你可以把“map”节点放在一个active = true的GameObject上,无论是关闭 或者 显示 代码中写起来都很方便。 假如你的map节点就是顶级节点,那么它一旦天生acive = false ,那么你将无法得到它的对象,更无法设置它的属性了。

 GameObject root = GameObject.Find(“GameObject”);        

GameObject map =  root.transform.Find(“map”).gameObject;       

 map.SetActive(true);

#你好Unity3D#Unity获取游戏对象详解(来自我的长微博) - 雨松MOMO程序研究院 - 2

3. unity 还提供了几个获取游戏对象的方法,但是我个人觉得使用频率不高,这里也简单说两句。

GameObject.FindGameObjectsWithTag(“tag”)
GameObject.FindWithTag(“tag”)

根据一个标记来获取游戏对象,返回一个 或者 一个数组,我个人觉得这个两个方法没啥用,因为既然需要用到标记那么相比这个游戏对象必然是非常特殊的一个,所以我会把它存在内存中。

Object.FindObjectOfType
Object.FindObjectsOfType
Resources.FindObjectsOfTypeAll 

根据一个类型返回Object,比如 GameObject 、Texture、Animation 、甚至还可以是你自己写的一个脚本 的范型。它找起来很方便,可以返回一个 或者一个数组。 我觉得这几个方法其实游戏中也没啥用,不过在编辑器中使用的确实很频繁,比如你要做批量检查场景的工具,查找场景中有没有使用某个特殊类型的对象。 或者查看内存的占用量,看看当前内存中那些Texture没有被释放掉。 等等。

还有一个方法,如果你知道自对象的索引,还可以用下面的方法来获取,参数是index的索引。
transform.GetChild(0)

找到了一个即使隐藏root节点gameObject也能进行查找的方法。http://answers.unity3d.com/questions/52560/gameobjectfind-work-on-inactive-objects.html

 

转载于:https://www.cnblogs.com/dudu580231/p/6627768.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/291074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux怎么看是否安装kde桌面,ubuntu 7上安装kde桌面

开始使用Red Hat是因为一次服务器配置的需要,学院的精品课程建设需要自己建立一个支持JSP/Servlet 的服务器,由于以前做开发一直在windows平台下开发很少在linux下进行开发,最多也就是在linux 下进行测试。不过Red Hat的体积确实不敢恭维&am…

CSHOP后台设置SMTP发邮件提示 Error: need RCPT command 错误解决

其实错误原因并不是因为此错误,经检测,邮件服务器返回的真实错误是 501 mail from address must be same as authorization user 。只因为同时返回了 503 Error: need MAIL command 和 503 Error: need RCPT command ,而ECSHOP只提示了最后一…

真不值!技术大神,却只是阿里P6...

阅读本文大概需要5分钟。昨天在知乎上看到一个程序员发展的好问题:死月是前端领域一个比较知名的IP,之前在大搜车带领整个node团队,出过书写过技术专栏,在业内享有比较高的知名度。认识死月的同学都对他评价非常高,甚至…

linux之如何快速查看电脑内存大小

1、问题 linux之如何快速查看电脑内存大小 2、解决办法 vim /proc/meminfo 3、结果展示

有趣的时间

人的数字造型 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> <body> <embed width"160" height"70" allowscriptaccess"never…

为什么启动hbase shell后,创建按create 'test', 'cf'失败?

2019独角兽企业重金招聘Python工程师标准>>> 答&#xff1a;是hostname的问题。 sudo gedit /etc/localhosts 将你的主机名改为127.0.0.1 即可。 转载于:https://my.oschina.net/u/923087/blog/290592

mini2440:最简单的嵌入式linux驱动程序模块,mini2440:最简单的嵌入式Linux驱动程序模块 解决找不到mini2440……sample...

原文&#xff1a;http://myswirl.blog.163.com/blog/static/5131864220109143331356/注意&#xff1a;开发Arm平台的驱动&#xff0c;需要Arm平台的源码树&#xff1b;注意&#xff1a;ARM平台的linux内核源码需要先编译&#xff0c;否则无法编译驱动&#xff1b;第一种方式&am…

机器学习-tensorflow

为什么80%的码农都做不了架构师&#xff1f;>>> 例子1 先从helloworld开始: tubuntu:~$ python Python 2.7.6 (default, Oct 26 2016, 20:30:19) [GCC 4.8.4] on linux2 Type "help", "copyright", "credits" or "license&qu…

C# 多个异步方法的异常处理

、如果调用两个异步方法&#xff0c;每个都会抛出异常&#xff0c;该如何处理呢 ? 在下面的示例中&#xff0c;第一个 ThrowAfter 方法被调用&#xff0c;2s 后抛出异常(含消息 first)。该方法结束后&#xff0c;另一个 ThrowAfter 方法也被调用&#xff0c;1s 后也抛出异常。…

linux解pdf隐写工具,Linux版PDF解密工具PDFDecryptionTool-Deepin-amd64.deb下载

PDF解密工具PDFDecryptionTool的deb安装包提供下载了&#xff0c;可用在Deepin 20.2等Linux发行版中。该工具用于解除PDF文件的所有者权限的密码&#xff0c;解除编辑、复制等限制。另外&#xff0c;PDFDecryptionToolWin.py为Windows版本&#xff0c;针对Windows优化了下UI&am…

Mysql中explain命令查看语句执行概况

Mysql中可以使用explain命令查看查询语句的执行方式&#xff0c;使用方法举例&#xff1a;explain 查询语句 例如&#xff1a;explain select * from user_info 几个重要的字段说明&#xff1a; table&#xff1a;此次查询操作是关联哪张数据表 type&#xff1a;连接查询操作类…

Android之java.lang.UnsatisfiedLinkError(Failed to register native method ***callMethod1())解决办法

1、问题 Failed to register native method com.example.chenyu.test.JniClient.callMethod1() java.lang.UnsatisfiedLinkError: JNI_ERR returned from JNI_OnLoad in "/data/app/com.example.chenyu.test-2/lib/arm/libFirstJni.so" 如下图 2、解决办法 原因:…

代码段编辑器SnippetEditor 2.1

1.选择程序版本 2.可以创建文件夹 3.新建片段 4.给片段取名 5.双击进行编辑 6.点击保存 7.直接使用 转载于:https://www.cnblogs.com/shiworkyue/p/3844993.html

HUAWEI nova 青春版闪速快充,让追剧不再断电

笔者是一个对追剧到极致要求的人&#xff0c;每每有好看的影剧出来&#xff0c;都迫不及待想要一次看个够本。但是事与愿违&#xff0c;手机总是很不争气&#xff0c;虽然电池续航能力不算太差&#xff0c;但是对于我们这种追剧重症患者来说是完全不够的&#xff0c;每次出门还…

飞信linux下载文件,OpenFetion(飞信for Linux)

这是OpenFetion(飞信for Linux)&#xff0c;openfetion是使用GTK 编写的基于libofetion的用户界面。软件功能程序简洁轻快&#xff0c;界面美观&#xff0c;支持libofetion当前提供的所有功能。软件优势它是目前GNU/Linux平台上最优秀的飞信客户端程序&#xff0c;也是基于libo…

免费开源Blazor在线Ico转换工具

1. 功能效果演示 仓库地址&#xff1a;IcoTool[1]在线演示地址&#xff1a;https://tool.dotnet9.com/ico[2]演示下文件上传、转换结果&#xff1a;通过该工具及代码&#xff0c;能了解到&#xff1a;使用Blazor怎么上传文件到服务器(Blazor Server)。怎么从服务器下载文件。如…

【02】CC - 有意义的命名

为什么80%的码农都做不了架构师&#xff1f;>>> 1、提防使用不同之处较小的名称 XYZControllerForEfficientHandlingOfStrings 与 XYZControllerForEfficientStorageOfStrings 在IDE下&#xff0c;都有自动补全&#xff0c;这种细微的差别&#xff0c;容易补全错&a…

linux7 语言包,Centos 7中文语言包的安装及中文支持

1、修改配置文件etc/locale.confLANG"zh_CN.UTF-8"2、查看更改后的系统语言变量[root5c46832b5c01 ~]# localelocale: Cannot set LC_CTYPE to default locale: No such file or directorylocale: Cannot set LC_MESSAGES to default locale: No such file or direct…

如何在构建docker镜像时执行SonarQube扫描.NET Core应用

前言SonarQube是一款静态代码质量分析工具&#xff0c;它常用于检测代码中的Bug、漏洞和代码异味&#xff0c;并且能够集成在IDE、Jenkins、Git等服务中&#xff0c;方便随时查看代码质量分析报告。一般情况下&#xff0c;我们在Jenkins管道中配置SonarQube&#xff0c;在编译过…

Win10系列:VC++ Direct3D模板介绍1

Visual Studio为开发Direct3D应用程序提供了便捷的模版&#xff0c;读者可以不必手动去新建Direct3D中所使用到的基础资源&#xff0c;而只需专注于图形的绘制。本小节主要为读者介绍这个模版中用于绘制图形的主要函数及其功能&#xff0c;为了能让读者更为清楚地了解如何使用此…