Unity3D_01_各种寻找GameObject方法

1.GameObject.Find():

寻找Hierarchy面板中的activie 不为false的游戏对象; 
路径如官方事例写法: 
public class ExampleClass : MonoBehaviour { 
public GameObject hand; 
void Example() { 
hand = GameObject.Find(“Hand”); 
hand = GameObject.Find(“/Hand”); 
hand = GameObject.Find(“/Monster/Arm/Hand”); 
hand = GameObject.Find(“Monster/Arm/Hand”); 

}

注解: 
GameObject.Find()使用起来很方便,就是如果你的这个GameObject天生acive = false的话。那么你用GameObject.Find()是永远也无法获取它的对象的。如果对象都获取不到,那么对象身上脚本啊 组件啊啥的都是获取不到的,变成了没有意义的对象。 
GameObject.Find()方法在游戏中的使用频率很高。但是它也很消耗性能,你可以想想它的原理肯定也是用类似递归的形式来做的,那么我们就要尽量更少的调用GameObject.Find()方法,可以把获取的游戏对象,保存在内存里,这是再好不过的选择了。 尤其是在Update方法中不要去 Find()游戏对象!!

2.Transform.Find()

官方解释是通过名字获取到一个子物体(Finds a child by name and returns it),该方法可以获取到隐藏(inactive)的GameObject, 
可以通过先获得父对象(active必须为true),再通过寻找孩子Transform.Find()

1 GameObject root = GameObject.Find("GameObject");
2
3 GameObject xxxx = root.transform.Find("xxxx").gameObject;
4
5 xxxx.SetActive(true);

注解: 
还记得上面我说过用GameObject无法获取天生acive = false的游戏对象,如果你用Transform.Find()的话就可以很好的获取,另外Unity还提供了一个Transform.FindChind()的方法,这个方法未来会被unity废弃,大家最好就别用了,用Transform.Find()可以取代。 
如下代码,我们先获取顶级对象root 。接着用Find()去找它的子节点”xxxx”的对象,无论”xxxx”对象是否active = true 都是可以直接找到对象的。

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

   GameObject cube = root.transform.Find("xxxx/Cube").gameObject;

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

但是Transform.Find()必须要保证你的顶级父对象的activity = true。

举个例子,你做了一个场景有一些地图你在场景里面预先activie = false了, 你希望在游戏中的某个时间点把它们都打开 setActive(true)

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

1 GameObject root = GameObject.Find(“GameObject”);
2
3 GameObject map =  root.transform.Find(“map”).gameObject;
4
5 map.SetActive(true);

3. Unity 还提供了几个获取游戏对象的方法

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

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

Object.FindObjectOfType 
Object.FindObjectsOfType 
Resources.FindObjectsOfTypeAll

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

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

transform.GetChild(index);index为索引,0,1,2,3,4代表第几个child.

原文地址:https://www.cnblogs.com/NBOWeb/p/8967575.html

时间: 2024-08-30 09:43:35

Unity3D_01_各种寻找GameObject方法的相关文章

javascript 寻找错误方法

这篇博客必须写了,它浪费我了一个上午的时间.为了以后能快速寻找到这方面的错误,节约更多的时间. 情况是这样的:我写了一个后台管理系统是引用Marix Admin的,因为这个系统包含了很多很多框架,如jquery,bootstrap,还有它自身的框架系统marix,一大堆的js和css文件.你想引入外面的框架时,就会和原来的库文件产生冲突,还有就是书写的格式问题. 针对上面两大问题,解决方案如下: 首先查看网站效果,如果html没有显示出来,可能是html格式的问题,如果css格式没有显示出来可能

您可能正在上传很大的文件,请参考文档来寻找解决方法

[问题背景]:本地进行我们的XXX 2.0版本 重新搭建环境,这个是为了一个客户开发新的功能而重新搭建本地环境. 在导入的时候,用phpMyAdmin去导入11多M左右的mysql数据库文件时出错: [解决过程] 1.很明显,是文件太大,无法导入.即上传文件大小有限制.所以要去解除此限制. 2.其实这个很简单的只要更改php.ini里三个配置即可.(见下面加粗部分,改成你自己的需求即可) ; Maximum allowed size for uploaded files. ; http://ph

phpmyadmin-您可能正在上传很大的文件,请参考文档来寻找解决方法

C:\Program Files\php-7.0.8 实这个很简单的只要更改php.ini里三个配置即可.(见下面加粗部分,改成你自己的需求即可) ; Maximum allowed size for uploaded files. ; http://php.net/upload-max-filesize ;upload_max_filesize = 2M upload_max_filesize = 300M ; Maximum amount of memory a script may con

科学家寻找阻止蚊子的新方法

The sound of a mosquito can mean trouble in many parts of the world.The bite of a mosquito can be deadly.Today, we will hear about some of the diseases these insects carry and what scientists are doing to help protect people. 蚊子的声音在世界的许多地方意味着麻烦.被蚊子叮咬

数值算法:无约束优化之一维搜索方法之划界法寻找极小点上下界

前面介绍的黄金分割法.斐波那契数列法.二分法.牛顿法.割线法寻找极小点方法的前提是: 给定初始区间,它包含一个单峰的f(x). 如何寻找这个初始区间? 划界法:(挑选一个含有极小点的区间) 随机挑选3个点x1.x2.x3, 如果 f(x2)<f(x1) 且 f(x2)<f(x3) ,那么 [x1, x3]包含极小点.如果f(x1)>f(x2)>f(x3),那么选择一个点x4,x4>x3, 使得 f(x2) <f(x4)成立,这样[x1, x4]包含极小点.如果f(x1)

7.python字符串-内置方法分析

上篇对python中的字符串进行了列举和简单说明,但这些方法太多,逐一背下效率实在太低,下面我来对这些方法安装其功能进行总结: 1.字母大小写相关(中文无效) 1.1 S.upper() -> string 返回一个字母全部大写的副本 1.2 S.lower() -> string 返回一个字母全是小写的副本 1.3 S.swapcase() -> string 返回一个字母大小写转换后的副本 1.4 S.title() -> string 将单词的首字母大写,即为所谓的标题 方框

CentOS 7下的软件安装方法及策略

一些废话 2010年开始正式接触Linux,入门发行版是Ubuntu 10.10,后来过渡到Ubunu 11.04,这其中也尝试了很多其他主流的发行版.进入实验室之后,开始用CentOS 5,然后是CentOS 6,现在进化到CentOS 7. 使用了四年的Linux,前三年都是在瞎折腾,浪费了不少时间,也得到了不少经验与教训.现在可能是真的老了,已经不愿意折腾了,只希望配置好一个系统之后,就一直使用下去. 为什么要写/读这一篇 使用Linux尤其是CentOS会遇到一些坑,或是一些有洁癖的人不

windows平台下的oracle ORA-01031的解决方法

今天下午遇到一个很怪异的问题,在windows平台下sqlplus  / as sysdba登陆数据库,提示权限不足, 当时就纳闷了,sys用户登陆数据库还能权限不足,问题出现了,就开始寻找解决方法呗 首先查看$ORACLE_HOME/network/admin/sqlnet.ora中SQLNET.AUTHENTICATION_SERVICES项的配置信息, 网上的大多数帖子一致结论为: 在windows平台上,SQLNET.AUTHENTICATION_SERVICES必须设置为NTS或者AL

Eclipse中Android公共库的正确建立及调用方法(转)

转自http://www.cnblogs.com/SkyD/archive/2011/09/01/2161502.html 引言 之前一直头痛于没有办法在多个程序中共享资源,用作公共类库的方法也是使用的导出jar再导入的办法,现在终于初步搞明白了,可算解脱了~,分享出来. 建立公共库 首先建立公共库的Android项目,名为MyCoreLib: 完成后在左侧包浏览器里右键点选我们新建的这个项目,选择Properties项: 左侧选择Android分类,右侧勾选Is Library选项: 完成后在