一篇小白也能看懂的查找游戏物体的方式解析–Unity之查找物体

一篇小白也能看懂的查找游戏物体的方式解析–Unity之查找物体

1. 对象.Find()

Object.Find():按名称查找游戏对象并返回它。

void ObjectFind()
{
    // 找父级
    GameObject parent = GameObject.Find("GameObject");
    Debug.Log("找父级物体,是否找到:" + (parent != null));
    
    // 找子级
    GameObject child = GameObject.Find("Child");
    Debug.Log("找子级物体,是否找到:" + (child != null));
    
    // 找父级隐藏物体
    GameObject parentHide = GameObject.Find("GameObjectHide");
    Debug.Log("找父级隐藏物体,是否找到:" + (parentHide != null));
    
    // 找子级隐藏物体
    GameObject childHide = GameObject.Find("ChildHide");
    Debug.Log("找子级隐藏物体,是否找到:" + (childHide != null));
}

测试结果如下:

ObjectFind

当使用 GameObject.Find("GameObject") 并且场景中有多个名为“GameObject”的对象时游戏运营,将每个“GameObject”设置为不同的标签并运行多次以检查结果。

测试场景如下:

搭建场景

测试代码如下:

// 找同名物体
GameObject nameObj = GameObject.Find("GameObject");
Debug.Log("找同名,是否找到:" + nameObj.tag);

测试结果:搜索顺序为:“self”(脚本挂载的对象)-->自身同级之上的对象-->自身同级之下的对象-->自己的子对象-- > 它自己的父对象。

找同名物体

Object.Find() 得出结论:

全局搜索参数名称游戏对象; 禁用(隐藏)的对象将不会被搜索; 如果存在同名对象,则按照层次关系进行查找。

使用建议:当存在同名对象时,尽量不要使用Object.Find()进行搜索,或者在使用Object.Find()进行搜索时,应控制搜索对象的名称唯一。

2.FindGameObjectWithTag()

GameObject.FindGameObjectWithTag() 根据标签查找游戏对象并返回。

GameObject.FindGameObjectsWithTag() 根据标签查找当前场景中所有带有该标签的游戏​​对象,并返回所有对象的数组。

以下场景:将除主摄像机外的所有游戏对象的标签更改为Player进行测试。

测试场景

测试代码如下:

void GameObjectFindWithTag()
{
    GameObject tagObj = GameObject.FindGameObjectWithTag("MainCamera");
    Debug.Log("根据标签查找游戏物体,是否查到:" + (tagObj != null));
    
    GameObject[] tagObjs = GameObject.FindGameObjectsWithTag("Player");
    for (int i = 0; i < tagObjs.Length; i++)
    {
        Debug.Log("根据标签查找游戏物体名称:" + tagObjs[i].name);
    }
}

检测结果:

测试结果

查找不存在的标签测试:

GameObject tagObj = GameObject.FindGameObjectWithTag("MainCamera1");
Debug.Log("根据标签查找游戏物体,是否查到:" + (tagObj != null));

不存标签

错误:UnityException:标签:MainCamera1 未定义。 翻译:MainCamera1 是一个未定义的标签

FindGameObjectWithTag() 得出结论:

3. GameObject.FindObjectOfType()

和上面根据标签进行搜索的逻辑类似。

GameObject.FindObjectOfType(); :根据类型(组件/自定义脚本)查找并返回此类。

GameObject.FindObjectsOfType():根据类型(组件/自定义脚本)查找当前场景中所有该类,并返回该类的数组。

void FindObjectOfType()
{
     Camera typeCamera = GameObject.FindObjectOfType();
     Debug.Log("根据类型查找物体,是否查到:" + (typeCamera != null));
     
     Transform[] typeTransArr = GameObject.FindObjectsOfType();
     for (int i = 0; i < typeTransArr.Length; i++)
     {
         Debug.Log("根据类型查找到的物体名称:" + typeTransArr[i].name);
     }
}

测试结果

FindObjectOfType() 得出结论:

常见用例是:在初始化期间获取一个脚本中对另一个脚本的引用unity 找到子物体,并以此形式进行搜索。 【后来大多被单例取代】

4. 变换.Find()

查找已安装对象的父对象、同级对象和子对象:

void TransformFind()
{
    // 找父级
    Transform parent = transform.Find("Root");
    Debug.Log("找父级物体,是否找到:" + (parent != null));
    
    // 找同级
    Transform selfObj = transform.Find("Parent_1");
    Debug.Log("找同级物体,是否找到:" + (selfObj != null));
    
    // 找子级
    Transform child = transform.Find("Child");
    Debug.Log("找子级物体,是否找到:" + (child != null));
    
    // 找子级隐藏物体
    Transform childHide = transform.Find("ChildHide");
    Debug.Log("找子级隐藏物体,是否找到:" + (childHide != null));
}

TransformFind

查找多级子对象:

// 找二级子物体
Transform child_1 = transform.Find("Child_1_1");
Debug.Log("找二级子物体 参数只写名称,是否找到:" + (child_1 != null));
// 找二级子物体
Transform child_1_1 = transform.Find("Child/Child_1_1");
Debug.Log("找二级子物体 参数写全路径,是否找到:" + (child_1_1 != null));

找二级子物体

Find() 的结论是:

5. Transform.FindObjectOfType()

经过测试,它和GameObject.FindObjectOfType()没有任何区别。 测试结果一致。 测试代码和截图不占空间。

在测试过程中,我发现 GameObject.FindObjectsOfType() 和 Transform.FindObjectsOfType() 被合并了。 应该说,它们是完全一样的方法。 从下图中可以看到,虽然我之前输入了Transform标签unity 找到子物体,但是它是灰色的。 当您将鼠标放在它上面时,您会看到方法引用是 GameObject.FindObjectsOfType。

测试结果

得到结论:

Transform.FindObjectOfType() 和 GameObject.FindObjectOfType() 的使用方式相同,结果没有什么不同...

6. 变换.GetChild()

Transform.GetChild()是一种查找子对象的方法,也是我个人比较喜欢使用的方法。 缺点是游戏对象的层级关系不能随意修改。

使用起来也非常简单

例如:查找第一级子对象的第一个对象

Transform child1 = transform.GetChild(0);

查找第一级子对象的第一个对象的第三个子对象

Transform child1 = transform.GetChild(0).GetChild(2);

使用方法:GetChild()为多个级别,参数为当前级别的对象(从0开始)

使用扩展:

遍历子对象:

for (int i = 0; i < transform.childCount; i++)
{
     Debug.Log(transform.transform);
}

获取当前对象的父对象transform.parent

获取当前对象的根对象transform.root

Transform.GetChild() 用法总结:

总结

关于在 Unity 中查找游戏对象的六种方法的文章到此结束。 更多关于在Unity中查找游戏对象的信息硬件设备,请搜索Script House之前的文章或者继续浏览下面的相关文章。 希望大家以后多多支持脚本。 到家了!

文章来源:https://m.jb51.net/article/214177.htm