• GameObjectFindTransformFind查找游戏对象

    • 前置条件
    • 相关API
      • 1 GameObjectFind
      • 2 TransformFind
      • 3 其他查找
    • 实际测试
    • 即使隐藏root节点gameObject也能进行查找的方法

关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上~

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"); // false
GameObject.Find("A22"); // true// 孙子节点(受父节点影响)
GameObject.Find("A31"); // false
GameObject.Find("A32"); // false
GameObject.Find("A33"); // false
GameObject.Find("A34"); // trueGameObject.Find("A34"); // true 相对路径查找
GameObject.Find("/A34"); // false 绝对路径查找
GameObject.Find("/A11/A22/A34"); // true
GameObject.Find("A11/A22/A34"); // true
GameObject.Find("/A22/A34"); // false
GameObject.Find("A22/A34"); // true
}// Transform.find
{
// 根节点
Transform A11 = transform.Find("A11"); // false// 父亲节点
Transform A21 = transform.Find("A21"); // true
Transform A22 = transform.Find("A22"); // true// 孙子节点
Transform A31 = transform.Find("A31"); // false
Transform A32 = transform.Find("A32"); // false
Transform A33 = transform.Find("A33"); // false
Transform A34 = transform.Find("A34"); // false// 使用相对于根节点的查找目录
Transform AA31 = transform.Find("A21/A31"); // true
Transform AA32 = transform.Find("A21/A32"); // true
Transform AA33 = transform.Find("A22/A33"); // true
Transform AA34 = transform.Find("A22/A34"); // true// 包含根节点的查找目录
Transform AA311 = transform.Find("A11/A21/A31"); // false
Transform AA321 = transform.Find("A11/A21/A32"); // false
Transform AA331 = transform.Find("A11/A22/A33"); // false
Transform AA341 = transform.Find("A11/A22/A34"); // false// 绝对路径
Transform AA3111 = transform.Find("/A11/A21/A31"); // false
Transform AA3211 = transform.Find("/A11/A21/A32"); // false
Transform AA3311 = transform.Find("/A11/A22/A33"); // false
Transform AA3411 = transform.Find("/A11/A22/A34"); // false
}
}

4 即使隐藏root节点gameObject也能进行查找的方法

找到了一个即使隐藏root节点gameObject也能进行查找的方法。 
GameObject.Find() work on inactive objects - Unity Answers

代码预览:

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获取游戏对象详解 
#你好Unity3D#Unity获取游戏对象详解(来自我的长微博) | 雨松MOMO程序研究院

关注公众号 风色年代(itfantasycc) 200G Unity资料合集送上~

Unity中使用GameObject.Find、Transform.Find查找GameObject相关推荐

  1. unity添加对象实例_在Unity中,如何通过值复制一个GameObject,以便在实例化之前修改它?...

    如果你想结合实例上运行几个GameObjects创建一个场景,你可以创建一个名为generateEnviroment.cs的脚本(只是一个示例名称),那么你应该p将一个或多个GameObjects作为 ...

  2. SiKi学院 Unity中常用api学习笔记(001-014)

    Api 应用程序编程接口 前言 笔记是看siki学院中<Unity中常用api>的学习笔记 课程地址:  http://www.sikiedu.com/my/course/59 强烈推荐大 ...

  3. Unity中常用的单例模式、对象池的脚本模板,连按退出和滑动翻页或放大缩小的功能实现,以及属性在代码中的灵活使用

    1.单例模式的脚本模板: Unity中针对一些常用的manager可以使用单例模式,用于统一的功能管理: //普通单例,不需要继承MonoBehavior,不用挂载在GameObject上 publi ...

  4. Unity中行星和恒星的旋转——Rotate和RotateAround

    Unity中的旋转--以行星环绕为例 实现效果 一.与之相关的两种旋转方式 1.Rotate 2.transform.RotateAround 二.行星案例的实现 Step1:我们先在场景中创建一个球 ...

  5. Unity中UnityEngine.Object和System.Object的区别

    在C#中所有的类都是直接或者间接的继承Object类 一:前言 在Unity中,UnityEngine.Object是UnityComponent和GameObject的父类,System.Objec ...

  6. Unity中Scale详解

    1.缩放变换 Scale代表的是缩放. 通常意义下的缩放变换,指的是利用缩放矩阵和物体的齐次坐标相乘而进行变换,缩放矩阵形如: Scalex代表x轴方向的缩放 Scaley代表y轴方向的缩放 Scal ...

  7. Unity中GameObject API解析

    如何在脚本中获取自身所在的GameObject? 我们知道脚本必须挂在一个GameObject上面才能执行,那么如何知道当前脚本所挂载的GameObject是哪一个呢? 这就需要用到gameObjec ...

  8. 【Unity3D游戏开发】GameObject.Find()、Transform.Find查找隐藏对象 (十)

    GameObjectFindTransformFind查找游戏对象 前置条件 相关API 1 GameObjectFind 2 TransformFind 3 其他查找 实际测试 即使隐藏root节点 ...

  9. unity中查找游戏对象的方法总结

    1.通过对象名称 (1).transform.Find (string name) 通过名字查找子对象并返回它,找不到返回null 注意如果参数中只有对象名称那么仅能查找所有儿子中的对象看是否有相同名 ...

最新文章

  1. Datawhale组队学习:数据结构与算法课程任务
  2. java异常处理好习惯
  3. 从新浪财经上下载交易明细数据并统计每天的买卖笔数(shell 命令行)
  4. 感知不强又徒增功耗?为何今年5G手机也这么重视AI
  5. JAVA编程语言的基础知识(六)
  6. Ubuntu中重启ssh服务时提示:Job for ssh.service failed because the control process exited with error code. See
  7. WPF的自定义控件 依赖属性,DependencyProperty 路由事件RoutedEvent
  8. 你真的知道怎么实现一个延迟队列吗 ?
  9. ubuntu 新增mysql用户_Ubuntu中给mysql添加新用户并分配权限
  10. 赛尔号什么时候支持html5,赛尔号三全能时代即将来临 你准备好了吗
  11. 不打好评不给用!苹果竟然把这种“流氓” App 都放出来?
  12. Google云也想为中国企业服务,正与腾讯浪潮谈合作
  13. 林斌宣布好消息!语音识别大佬、Kaldi之父加盟小米
  14. RAIM (GNSS完好性监测算法合集)
  15. CAD教程:CAD软件打开图纸后钢筋符号无法读取的解决办法
  16. 颈椎病自我治疗预防颈椎病
  17. 百度地图ModuleNotFoundError: No module named ‘aip‘
  18. 本周AI热点回顾:政府数据将开放共享、生命游戏发明者逝世、百度Apollo对外发布“ACE 交通引擎”
  19. ubuntu Pathon 目录
  20. Windows系统下CMD添加删除用户、用户组

热门文章

  1. 华中科技大学计算机暑期夏令营,2019年华中科技大学计算机专业夏令营
  2. python增强运算符_Python学习【第3篇】:Python之运算符
  3. ❤️《Mybatis从基础到高级》(建议收藏)❤️
  4. Qt之问题: Unknown module(s) in QT: multimedia
  5. Ubuntu之安装摄像头软件GTK_UVC_Viewer
  6. springboot 数据权限_13 个最火的 SpringBoot 实战开源项目推荐!总有一个适合你!...
  7. 工业4.0围观,大炒作,大问题,大差距,你发现了吗?
  8. [译] 使用 iPhone X 与 Maya 实现快速面部捕捉
  9. C#笔记03 运算符和分支结构
  10. java异常体系_Java异常体系(Throwable、Error、Exception)