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"); // true GameObject.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也能进行查找的方法。 
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);
}

【Unity3D游戏开发】GameObject.Find()、Transform.Find查找隐藏对象 (十)的更多相关文章

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

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

  2. [Unity3D]Unity3D游戏开发之飞机大战项目解说

    大家好,我是秦元培,欢迎大家继续关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei. 首先感谢大家对我博客的关注,今天我想和大家分享的是一个飞机大战的项目.这是一个比較综合的 ...

  3. [Unity3D]Unity3D游戏开发之跑酷游戏项目解说

    大家好,我是秦元培.我參加了CSDN2014博客之星的评选,欢迎大家为我投票,同一时候希望在新的一年里大家能继续支持我的博客. 大家晚上好.我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.c ...

  4. [Unity3D]Unity3D游戏开发之伤害数值显示

    大家好,我是秦元培,欢迎大家关注我的博客,我的博客地址是blog.csdn.net/qinyuanpei.众所周知,在RPG游戏策划中最为重要的一个环节是数值策划.数值策划是一个关于游戏平衡方面的概念 ...

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

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

  6. Unity3D游戏开发之连续滚动背景

    Unity3D游戏开发之连续滚动背景 原文  http://blog.csdn.net/qinyuanpei/article/details/22983421 在诸如天天跑酷等2D游戏中,因为游戏须要 ...

  7. Unity3D游戏开发从零单排(四) - 制作一个iOS游戏

    提要 此篇是一个国外教程的翻译,尽管有点老,可是适合新手入门. 自己去写代码.debug,布置场景,能够收获到非常多.游戏邦上已经有前面两部分的译文,这里翻译的是游戏的最后一个部分. 欢迎回来 在第一 ...

  8. [Unity3D]Unity3D游戏开发《反对》说到游戏(上)——目标跟踪

    朋友,大家好.我是秦培,欢迎关注我的博客.我的博客地址blog.csdn.net/qinyuanpei. 首先博主要自我反省,过了这么久才来更新博客,这段时间主要是在忙着写期末的作业,所以博主基本上没 ...

  9. [Unity3D]Unity3D游戏开发3D选择场景中的对象,并显示轮廓效果强化版

    大家好,我是秦培,欢迎关注我的博客,我的博客地址blog.csdn.net/qinyuanpei. 在上一篇文章中,我们通过自己定义着色器实现了一个简单的在3D游戏中选取.显示物体轮廓的实例. 在文章 ...

随机推荐

  1. PAT乙级 1007. 素数对猜想 (20)

    1007. 素数对猜想 (20) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 让我们定义 dn 为:dn = ...

  2. 关键词:ACM & 大小端 & 面试官

    关于“ACM” fender0107401 :面试了一个在ACM拿过奖的人 我问了他几个问题: 读取数组中的一个元素,计算复杂度是多少,回答不清楚. 往链表里面存一个数,不排序的情况下,计算复杂度是多 ...

  3. 160912、工具类:spring+springmvc自定义编码转换

    一.自定义的类(注意其中的属性,web.xml中的配置就是根据这个类的) import org.springframework.web.filter.OncePerRequestFilter; imp ...

  4. PHP用substr截取字符串出现中文乱码问题用mb_substr

    PHP用substr截取字符串出现中文乱码问题用mb_substr实例:mb_substr('截取中文乱码问题测试',0,5, 'utf-8'); 语法 : string substr (string ...

  5. win32 Ui 编程 收集

    ---恢复内容开始--- windows sdk编程系列---- 通用控件 http://www.cnblogs.com/MoreNotepad-plus-plus/articles/3164534. ...

  6. mysql5.5.x升级到mysql5.6.x

    大概步骤是: 把配置文件添加:skip-grant-tables参数,把basedir升级成新版本,启动mysql,执行命令:mysql_upgrade升级一下字典信息,然后flush privile ...

  7. [Unity3D]unity3d5.0简单的调用摄像头

    Unity3D中新建一个工程,加一个Plane,新建一个C# 脚本,将这个脚本添加到Plane上,调用摄像头.(如果显示的图片居然是翻转的,Plane的Rotation 值就可以了) 以下是脚本内容: ...

  8. 【20160924】GOCVHelper MFC增强算法(2)

    //创建或续写目录下的csv文件,填写“文件位置-分类”对     int writeCsv(const string& filename,const Vector<pair<st ...

  9. Unity-Animato深入系列---FloatValue阻尼

    回到 Animator深入系列总目录 Animator的SetFloat接口可以设置阻尼,并且4种类型变量只有float是支持阻尼的. public void SetFloat(int id, flo ...

  10. Uva 1599 最佳路径

    题目链接:https://uva.onlinejudge.org/external/15/1599.pdf 题意: 保证在最短路的时候,输出字典序最小的路径. 方法: 路径上有了权值,可以利用图论的数 ...