• 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查找隐藏对象 (十)相关推荐

  1. 【Unity3D游戏开发】之多语言缩写对应表 (十五)

    游戏开发时,iOS会返回当前语言为 "en"."zh"."zh-Hans"."zh-Hant"等等 Unity对应的语言 ...

  2. 【Unity3D游戏开发学习笔记】(六)上帝之手—GameObject的操作

    在Unity中,所有实体都属于游戏对象(GameObject),比如外部导入到场景中的模型,Unity自带的立方体等等,而要将这些GameOject进行管理,交互等操作,则需要用到脚本来实现,上一节我 ...

  3. Unity3D游戏开发-宣雨松读书摘要(2015-4-17 18:36)

    本书基于Unity3.5编写,通过丰富的游戏实例,以JavaScript与C#两种语言介绍Unity开发. Unity3D游戏开发-宣雨松 序 它支持JavaScript.C#.Boo三种脚本语言 ...

  4. Unity3D游戏开发之仿仙剑奇侠传一2D游戏 (一)

    今天要和大家分享的是基于Unity3D开发2D游戏,博主一直钟爱于国产武侠RPG,这个我在开始写Unity3D游戏开发系列文章的时候就已经说过了,所以我们今天要做的就是利用Unity3D来实现在2D游 ...

  5. Unity3D游戏开发初探—2.初步了解3D模型基础

    一.什么是3D模型? 1.1 3D模型概述 简而言之,3D模型就是三维的.立体的模型,D是英文Dimensions的缩写. 3D模型也可以说是用3Ds MAX建造的立体模型,包括各种建筑.人物.植被. ...

  6. Unity3D游戏开发之仿仙剑奇侠传角色控制效果

    在上一篇文章中,我们从Unity3D为我们提供的相机原型实现了非编码式的小地图,如果结合GUI在这个小地图下面绘制一些背景贴图,相信整体的效果会更好一些.博主希望这个问题大家能够自己去做更深入的研究, ...

  7. 《学Unity的猫》——第十八集:Unity3D游戏开发工程师笔试刷题,皮皮收到面试邀请

    文章目录 18.1 皮皮收到面试邀请 18.2 面试题库相关网站 18.2.1 牛客网 18.2.2 领扣LintCode 18.2.3 力扣LeetCode 18.3 优质学习网站 18.3.1 菜 ...

  8. [Unity3D]Unity3D游戏开发之怪物AI

    大家好,欢迎大家关注由我为大家带来的Unity3D游戏开发系列文章,我的博客地址为:http://blog.csdn.net/qinyuanpei. 在上一篇文章中,我们基本上实现了一个小地图的功能, ...

  9. android+Unity3D游戏开发之简单的物体运动

    android+Unity3D游戏开发之简单的物体运动 其实这篇也是转载的,真的感觉对于我们初学者来说很不错的,不信你看看嘛;原创链接:http://bbs.9ria.com/thread-98192 ...

最新文章

  1. starrocks问题小结
  2. Java数据结构与算法:排序算法
  3. 安装好Pycharm后如何配置Python解释器简易教程
  4. Retrofit 注解参数详解
  5. libsvm工具箱会和matlab,MATLAB实现多分类和libsvm工具箱的安装使用详解
  6. linux编写运行shell程序,Linux的Shell编程运行Shell程序的方法有哪些呢?
  7. 一步步编写操作系统 40 内存分页下用户程序与操作系统的关系
  8. 看了2022华为春季发布会
  9. java统计字符串中每个字符出现的次数_统计字符串出现的次数
  10. OpenCV3学习(8.2)直方图相似度比较compareHist函数与EMD距离
  11. 小程序-读取视频数据 每个N帧采样保存
  12. 创意对抗网络(CANs)你知多少?
  13. 还在使用集合类完成这些功能?不妨来看看 Guava 集合类!!!
  14. MySQL的安装(完整版)
  15. OFDM链路自适应算法 注水算法简单c++实现
  16. dmz和端口映射_无线路由大讲堂:端口映射触发与DMZ主机
  17. java 单机传奇_Win7/Win10系统架设单机传奇手游教程[战神引擎]
  18. 关于EasyDarwinGo部署海康威视rtsp转hls视频多摄像头的服务器视频转码
  19. 47 《清单革命》 -豆瓣评分7.0
  20. 高版本CAD如何降低版本?来看这种降低版本方法

热门文章

  1. 吴恩达深度学习作业编程1【识别猫片】
  2. c++多线程生产者与消费者问题代码
  3. vijos- P1383盗窃-黑珍珠 (python + 代码优化)
  4. 3分钟了解思极有容数据库的2020
  5. 杭州城市数据大脑发布:首战交通拥堵
  6. HTML5与CSS3的新特性。
  7. SpringBoot访问静态资源(图片)
  8. 【读论文-笔记】——2.沐神读Resnet
  9. 石家庄医学高等专科学校计算机试题,石家庄医学高等专科学校高职单招医学类对口职业测试题...
  10. 谁小时候没有计算机课,你的童年电脑记忆里有它们吗?