序列化变量后拖游戏对象的方法就不说了,最简单也是最麻烦的方法。html
经过场景里面的名子或者一个路径直接获取游戏对象。 数组
GameObject root = GameObject.Find(“GameObject”);
我以为若是游戏对象没再最上层,那么最好使用路径的方法,由于有可能你的游戏对象会有重名的状况,路径用“/”符号隔开便可。编辑器
GameObject root = GameObject.Find(“GameObject/Cube”);
GameObject.Find()使用起来很方便,可是它有个缺陷以下图所示,就是若是你的这个GameObject天生acive = false的话。那么你用GameObject.Find()是永远也没法获取它的对象的。若是对象都获取不到,那么对象身上脚本啊 组件啊啥的都是获取不到的,变成了没有意义的对象。 就这个问题我查过不少资料,最终也无果。。可是我用另一个巧妙的办法能够解决它。(后面详解)或者你也能够提早把全部的游戏对象保存在内存中。工具
GameObject.Find()方法在游戏中的使用频率很高。可是它也很消耗性能,你能够想一想它的原理确定也是用相似递归的形式来作的,那么咱们就要尽可能更少的调用GameObject.Find()方法,能够把获取的游戏对象,保存在内存里,这是再好不过的选择了。 尤为是在Update方法中不要去 Find()游戏对象!!性能
还记得上面我说过用GameObject没法获取天生acive = false的游戏对象,若是你用Transform.Find()的话就能够很好的获取,另外Unity还提供了一个Transform.FindChind()的方法,这个方法将来会被unity废弃,你们最好就别用了,用Transform.Find()能够取代。
以下代码,咱们先获取顶级对象root 。接着用Find()去找它的子节点”xxxx”的对象,不管”xxxx”对象是否active = true 都是能够直接找到对象的。
3d
GameObject root = GameObject.Find("GameObject"); GameObject xxxx = root.transform.Find("xxxx").gameObject; xxxx.SetActive(true);
Find()方法只能直接去找子节点,若是你想找 孙节点,那么能够用”/“符号把层级关系隔开,找起来很方便。一样不管”xxxx”对象是否active = true 都是能够直接找到对象的。code
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 ,那么你将没法获得它的对象,更没法设置它的属性了。orm
GameObject root = GameObject.Find(“GameObject”); GameObject map = root.transform.Find(“map”).gameObject; map.SetActive(true);**
根据一个标记来获取游戏对象,返回一个 或者 一个数组,我我的以为这个两个方法没啥用,由于既然须要用到标记那么相比这个游戏对象必然是很是特殊的一个,因此我会把它存在内存中。
Object.FindObjectOfType
Object.FindObjectsOfType
Resources.FindObjectsOfTypeAll
根据一个类型返回Object,好比 GameObject 、Texture、Animation 、甚至还能够是你本身写的一个脚本 的范型。它找起来很方便,能够返回一个 或者一个数组。 我以为这几个方法其实游戏中也没啥用,不过在编辑器中使用的确实很频繁,好比你要作批量检查场景的工具,查找场景中有没有使用某个特殊类型的对象。 或者查看内存的占用量,看看当前内存中那些Texture没有被释放掉。 等等。
还有一个方法,若是你知道自对象的索引,还能够用下面的方法来获取,参数是index的索引。
transform.GetChild(0)htm
找到了一个即便隐藏root节点gameObject也能进行查找的方法。http://answers.unity3d.com/questions/52560/gameobjectfind-work-on-inactive-objects.html对象