【Unity3D游戏开发】GameObject.Find()、Transform.Find查找隐藏对象 (十)
- GameObjectFindTransformFind查找游戏对象
- 前置条件
- 相关API
- 1 GameObjectFind
- 2 TransformFind
- 3 其他查找
- 实际测试
- 即使隐藏root节点gameObject也能进行查找的方法
GameObject.Find()、Transform.Find查找游戏对象
1.前置条件
Unity中常用到查找对象,非隐藏的、隐藏的,各种方法性能有高有低,使用又有各种条件限制。
在此对查找的性能和条件进行分析。开发时遇到的主要问题是查找隐藏对象。
没有完美的查找方法,只有最合适的查找方法
最后附带上测试代码
2.相关API
GameObject.Find
Transform.Find
GameObject.FindWithTag
GameObject.FindGameObjectsWithTag
Resources.FindObjectsOfTypeAll
2.1 GameObject.Find
通过名字或路径查找游戏对象。
GameObject.Find("GameObject");
GameObject.Find("GameObject/ChildGameObject);
使用规范:
1.无法查找隐藏对象
隐藏对象包括查找路径的任何一个父节点隐藏(active=false)
2.如果查找不在最上层,建议合理使用路径查找,路径查找是把双刃剑
优点1:解决查找中可能出现的重名问题。
优点2:如果有完全的路径,减少查找范围,减少查找时间。
缺点: 路径或结构调整后,容易影响到程序中的查找,需要重新定位查找路径。
3.如果路径查找中的任何一个父节点active=false,这个对象都将查找不到。
4.使用方便但效率低下
此查找相当于递归遍历查找,虽使用方便但效率堪忧,建议在Start()函数中查找对象并保存引用,切忌在Update()中动态查找。
2.2 Transform.Find
1.可以查找隐藏对象
2.支持路径查找
3.查找隐藏对象的前提是transform所在的根节点必须可见,即active=true
GameObject root = GameObject.Find("root");
root.SetActive(false); // 根节点为空// 总是查找失败
root.transform.Find("root/AnyChildObjectName");
实际开发:
实际开发中会将功能预制体放到一个可见的GameObject目录下,将这个GameObject目录作为查找根节点,下面的所有对象(隐藏、非隐藏)都可以查找到。
你可以把”map”节点放在一个active = true的MapRoot上,无论是关闭 或者 显示 代码中写起来都很方便。 假如你的map节点就是顶级节点,那么它一旦天生acive = false ,那么你将无法得到它的对象,更无法设置它的属性了。
GameObject root = GameObject.Find("MapRoot");GameObject map = root.transform.Find("map").gameObject;
map.SetActive(true);
2.3 其他查找
GameObject.FindWithTag
GameObject.FindGameObjectsWithTag
使用极少,并无卵用
Resources.FindObjectsOfTypeAll
返回指定类型的对象列表。主要用于编辑器中,eg。检测内存泄露、批量查找的功能等
3 实际测试
目录结构如下,绿色代表现实,红色代表隐藏
void Start () {// GameObject.Find{// 根节点GameObject.Find("A11"); // true// 父节点(受父节点影响)GameObject.Find("A21"); // falseGameObject.Find("A22"); // true// 孙子节点(受父节点影响)GameObject.Find("A31"); // false GameObject.Find("A32"); // falseGameObject.Find("A33"); // falseGameObject.Find("A34"); // trueGameObject.Find("A34"); // true 相对路径查找GameObject.Find("/A34"); // false 绝对路径查找GameObject.Find("/A11/A22/A34"); // trueGameObject.Find("A11/A22/A34"); // trueGameObject.Find("/A22/A34"); // falseGameObject.Find("A22/A34"); // true}// Transform.find{// 根节点Transform A11 = transform.Find("A11"); // false// 父亲节点Transform A21 = transform.Find("A21"); // trueTransform A22 = transform.Find("A22"); // true// 孙子节点Transform A31 = transform.Find("A31"); // falseTransform A32 = transform.Find("A32"); // falseTransform A33 = transform.Find("A33"); // falseTransform A34 = transform.Find("A34"); // false// 使用相对于根节点的查找目录Transform AA31 = transform.Find("A21/A31"); // trueTransform AA32 = transform.Find("A21/A32"); // trueTransform AA33 = transform.Find("A22/A33"); // trueTransform AA34 = transform.Find("A22/A34"); // true// 包含根节点的查找目录Transform AA311 = transform.Find("A11/A21/A31"); // false Transform AA321 = transform.Find("A11/A21/A32"); // falseTransform AA331 = transform.Find("A11/A22/A33"); // falseTransform AA341 = transform.Find("A11/A22/A34"); // false// 绝对路径Transform AA3111 = transform.Find("/A11/A21/A31"); // falseTransform AA3211 = transform.Find("/A11/A21/A32"); // falseTransform AA3311 = transform.Find("/A11/A22/A33"); // falseTransform AA3411 = transform.Find("/A11/A22/A34"); // false}
}
4 即使隐藏root节点gameObject也能进行查找的方法
找到了一个即使隐藏root节点gameObject也能进行查找的方法。
http://answers.unity3d.com/questions/52560/gameobjectfind-work-on-inactive-objects.html
代码预览:
GameObject[] pAllObjects = (GameObject[])Resources.FindObjectsOfTypeAll(typeof(GameObject));foreach (GameObject pObject in pAllObjects){if (pObject.transform.parent != null){continue;}if (pObject.hideFlags == HideFlags.NotEditable || pObject.hideFlags == HideFlags.HideAndDontSave){continue;}if (Application.isEditor){string sAssetPath = AssetDatabase.GetAssetPath(pObject.transform.root.gameObject);if (!string.IsNullOrEmpty(sAssetPath)){continue;}}Debug.Log(pObject.name);}
参考文章:雨凇Unity获取游戏对象详解
http://www.xuanyusong.com/archives/2768
【Unity3D游戏开发】GameObject.Find()、Transform.Find查找隐藏对象 (十)相关推荐
- 【Unity3D游戏开发】之多语言缩写对应表 (十五)
游戏开发时,iOS会返回当前语言为 "en"."zh"."zh-Hans"."zh-Hant"等等 Unity对应的语言 ...
- 【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作
在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我 ...
- Unity3D游戏开发-宣雨松读书摘要(2015-4-17 18:36)
本书基于Unity3.5编写,通过丰富的游戏实例,以JavaScript与C#两种语言介绍Unity开发. Unity3D游戏开发-宣雨松 序 它支持JavaScript.C#.Boo三种脚本语言 ...
- Unity3D游戏开发之仿仙剑奇侠传一2D游戏 (一)
今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游 ...
- Unity3D游戏开发初探—2.初步了解3D模型基础
一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...
- Unity3D游戏开发之仿仙剑奇侠传角色控制效果
在上一篇文章中,我们从Unity3D为我们提供的相机原型实现了非编码式的小地图,如果结合GUI在这个小地图下面绘制一些背景贴图,相信整体的效果会更好一些.博主希望这个问题大家能够自己去做更深入的研究, ...
- 《学Unity的猫》——第十八集:Unity3D游戏开发工程师笔试刷题,皮皮收到面试邀请
文章目录 18.1 皮皮收到面试邀请 18.2 面试题库相关网站 18.2.1 牛客网 18.2.2 领扣LintCode 18.2.3 力扣LeetCode 18.3 优质学习网站 18.3.1 菜 ...
- [Unity3D]Unity3D游戏开发之怪物AI
大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei. 在上一篇文章中,我们基本上实现了一个小地图的功能, ...
- android+Unity3D游戏开发之简单的物体运动
android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...
最新文章
- starrocks问题小结
- Java数据结构与算法:排序算法
- 安装好Pycharm后如何配置Python解释器简易教程
- Retrofit 注解参数详解
- libsvm工具箱会和matlab,MATLAB实现多分类和libsvm工具箱的安装使用详解
- linux编写运行shell程序,Linux的Shell编程运行Shell程序的方法有哪些呢?
- 一步步编写操作系统 40 内存分页下用户程序与操作系统的关系
- 看了2022华为春季发布会
- java统计字符串中每个字符出现的次数_统计字符串出现的次数
- OpenCV3学习(8.2)直方图相似度比较compareHist函数与EMD距离
- 小程序-读取视频数据 每个N帧采样保存
- 创意对抗网络(CANs)你知多少?
- 还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!
- MySQL的安装(完整版)
- OFDM链路自适应算法 注水算法简单c++实现
- dmz和端口映射_无线路由大讲堂:端口映射触发与DMZ主机
- java 单机传奇_Win7/Win10系统架设单机传奇手游教程[战神引擎]
- 关于EasyDarwinGo部署海康威视rtsp转hls视频多摄像头的服务器视频转码
- 47 《清单革命》 -豆瓣评分7.0
- 高版本CAD如何降低版本?来看这种降低版本方法
热门文章
- 吴恩达深度学习作业编程1【识别猫片】
- c++多线程生产者与消费者问题代码
- vijos- P1383盗窃-黑珍珠 (python + 代码优化)
- 3分钟了解思极有容数据库的2020
- 杭州城市数据大脑发布:首战交通拥堵
- HTML5与CSS3的新特性。
- SpringBoot访问静态资源(图片)
- 【读论文-笔记】——2.沐神读Resnet
- 石家庄医学高等专科学校计算机试题,石家庄医学高等专科学校高职单招医学类对口职业测试题...
- 谁小时候没有计算机课,你的童年电脑记忆里有它们吗?