C#教程

关注公众号 jb51net

关闭
首页 > 软件编程 > C#教程 > Unity查找游戏物体

Unity查找游戏物体的六种方式详解

作者:陈言必行

最近学习unity3d做游戏,总结了一些实用的内容,所以下面这篇文章主要给大家介绍了关于Unity查找游戏物体的六种方式,需要的朋友可以参考下

一篇小白也能看懂的查找游戏物体的方式解析 – Unity 之 查找物体的几种方式。本文通过实际测试得出使用结论,大家进行简单记录,在使用时想不起来可以再来看看,多用几次基本就没有问题了。

一,Object.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);

测试结果: 查找顺序是:“自身”(挂载脚本的物体) --> 和自身同层级上面物体 --> 和自身同层级下面物体 --> 自身子物体 --> 自身父物体。

找同名物体

Object.Find()得出结论:

  1. 全局查找参数名称游戏物体;
  2. 不对禁用(隐藏)物体进行查找;
  3. 若有同名物体时根据层级关系进行查找。

使用建议: 有同名物体存在时,尽量不要使用Object.Find()进行查找,或者说使用Object.Find()进行查找时,应控制查找物体命名唯一。

二,FindGameObjectWithTag()

GameObject.FindGameObjectWithTag() 根据标签查找游戏物体并返回。
GameObject.FindGameObjectsWithTag() 根据标签查找当前场景中所有这个标签的游戏物体并返回所有物体的数组。

将如下场景:除主摄像机~(Main Camera)外的所有游戏物体的标签(Tag)~都修改为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: Tag: MainCamera1 is not defined. 翻译: MainCamera1是一个未定义的标签

FindGameObjectWithTag()得出结论:

三,GameObject.FindObjectOfType()

和上面根据标签查找的逻辑差不多。

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

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

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

测试结果

FindObjectOfType()得出结论:

通常使用情况为:初始化时在一个脚本中获取另一个脚本的引用,通过这种形式查找。【后多被单例取代】

四,Transform.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()得出结论:

五,Transform.FindObjectOfType()

经过测试和GameObject.FindObjectOfType()没什么区别,测试结果一致,测试代码和截图就不发处理占地方了。

测试时我发现 GameObject.FindObjectsOfType<类型>()Transform.FindObjectsOfType<Transform>() 被合并了,应该说完全是一个方法了,根据下图可以看到,我虽然前打的是Transform的标签,但是它是灰色的,鼠标放上去看到方法引用的却是GameObject.FindObjectsOfType

测试结果

得出结论:
Transform.FindObjectOfType() 和 GameObject.FindObjectOfType()使用方式一样,结果也没有区别…

六,transform.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查找游戏物体内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文