Unity查找物体的四大主流方法及区别

简介: Unity查找物体的四大主流方法及区别GameObject.Find()Transform.Find()GameObject.FindGameObjectsWithTag()FindObjectsOfType()不少新人在刚接触unity查找物体的方法时,因为没有认识到几种查找物体方法它们之间的区别,而遇到bug 即“空引用异常”报错,我在这里说明一下它们的区别,供大家参考。

Unity查找物体的四大主流方法及区别
GameObject.Find()
Transform.Find()
GameObject.FindGameObjectsWithTag()
FindObjectsOfType()

不少新人在刚接触unity查找物体的方法时,因为没有认识到几种查找物体方法它们之间的区别,而遇到bug 即“空引用异常”报错,我在这里说明一下它们的区别,供大家参考。同时这几种方法也没有绝对的好与坏,每种方法都有其适合使用的一些情况。

GameObject.Find()
优点:

使用简单方便
不会因为重名而报错,同时查找的是自上而下的第一个物体
缺点

不能查找被隐藏的物体,否则出现“空引用异常”,这是很多新人在查找出现空引用bug的原因。
全局查找(遍历查找),查找效率低,很消耗性能。
代码演示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class GameObjectFind : MonoBehaviour {

private GameObject thing;

void Start () {

    thing = GameObject.Find("C4");
    thing.name = "thing";
    
}

}

Transform.Find(),通过Transform组件查找子物体。
用这个方法查找物体时,根节点一定要处于“显示”状态,不能被隐藏。
用它查找孙物体及孙孙物体,一定要使用“绝对路径”,否则出现“空引用异常”。
代码演示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TransformFind : MonoBehaviour {

private Transform m_Transform;
private GameObject one;
private GameObject two;

void Start () {

    m_Transform = gameObject.GetComponent<Transform>();
    one = m_Transform.Find("D2").gameObject;
    two = m_Transform.Find("D2/D3").gameObject;

    Debug.Log(one.name);
    Debug.Log(two.name);

}

}

GameObject.FindGameObjectWithTag()和GameObject.FindGameObjectsWithTag(),通过Tag标签查找物体。
GameObject.FindGameObjectsWithTag():通过Tag标签查找到一组物体,返回一个数组。
GameObject.FindGameObjectWithTag():查找到这类tag标签,自上而下第一个物体。

代码演示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class TagFind : MonoBehaviour {

private GameObject thing;
private GameObject[] things;
void Start () {

    things = GameObject.FindGameObjectsWithTag("Player");
    thing = GameObject.FindGameObjectWithTag("Player");

    Debug.Log(things.Length);
    Debug.Log(thing.name);
    
}    

}

FindObjectsOfType()
FindObjectsOfTypeAll():返回指定类型的对象列表。

代码演示:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class FindObjectOfType : MonoBehaviour {

private GameObject[] things;
private GameObject thing;

void Start () {

    things = FindObjectsOfType<GameObject>();
    thing = FindObjectOfType<GameObject>();

    Debug.Log("第一个" + thing.name);
    for(int i = 0; i < things.Length; i++)
    {
        Debug.Log(things[i].name);
    }    
}

}

其他方法
有一种方法,即使根节点被隐藏也能查找,大家自行百度。

喜欢的话可以关注我!别忘了点赞哦

作者:游戏人TH
来源:CSDN
原文:https://blog.csdn.net/qq_43157993/article/details/90411994
版权声明:本文为博主原创文章,转载请附上博文链接!

相关文章
|
7月前
|
图形学
Unity遍历子物体以及孙物体
遍历子物体以及孙物体
|
4月前
|
图形学
Unity用脚本创建物体
Unity用脚本创建物体
|
4月前
|
编译器 图形学
Unity用脚本获取物体和组件(下)
Unity用脚本获取物体和组件(下)
|
4月前
|
图形学
Unity 用脚本获取物体和组件(上)
Unity 用脚本获取物体和组件(上)
110 0
|
10月前
|
API 图形学
【Unity细节】RigidBody中Dynamic和Kinematic的区别
【Unity细节】RigidBody中Dynamic和Kinematic的区别
88 0
|
10月前
|
API 图形学
【unity细节】unity中实例化的物体在Game视图无法显示
【unity细节】unity中实例化的物体在Game视图无法显示
256 0
|
10月前
|
图形学
【unity细节】unity物体Model和prefab的区别
【unity细节】unity物体Model和prefab的区别
143 0
|
10月前
|
图形学 索引
【unity每日一记】-物体创建,获取,查找,继承
【unity每日一记】-物体创建,获取,查找,继承
88 0
|
10月前
|
图形学
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
unity基础-坦克炮管旋转发射炮弹(向量基础,射线碰撞,物体实例化)
247 0
|
图形学
Unity 编辑器开发实战【Editor Window】- Filter 物体筛选工具
Unity 编辑器开发实战【Editor Window】- Filter 物体筛选工具
263 0
Unity 编辑器开发实战【Editor Window】- Filter 物体筛选工具