unity查找物体方法

一,Object.Find()


  1. 全局查找参数名称游戏物体;

  1. 不对禁用(隐藏)物体进行查找;

  1. 若有同名物体时根据层级关系进行查找。

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

二,FindGameObjectWithTag()


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

GameObject.FindGameObjectsWithTag() 根据标签查找当前场景中所有这个标签的

FindGameObjectWithTag()得出结论:

  • 查找不到禁用物体,使用时需确认要查找的物体是启用(显示)状态;

  • 有多个有游戏物体使用同一标签时,尽量不使用FindGameObjectWithTag此方式查找单一游戏体,因为查找顺序会受到层级影响;

  • 查找未定义标签会报错,使用时需确认查找的字符串是已定义的标签;

  • 查找的标签是已定义但是未使用过,会找不到游戏物体,返回空值。

三,GameObject.FindObjectOfType()


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

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

FindObjectOfType()得出结论:

  • 查找不到禁用物体,使用时需确认要查找的物体是启用(显示)状态;

  • 查找场景中不存在类型时会返回null,不会报错;

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

四,Transform.Find()


  • 只能找其子物体,不能找其同级或更高层级物体

  • 找子物体时不考虑是否被禁用(隐藏)

  • 找多层子物体时需写全路径(否则即使存在也找不到)

五,Transform.FindObjectOfType()


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

六,transform.GetChild()


Transform.GetChild()是找子物体的方法,也是我个人比较喜欢用的方式,弊端是不能随意修改游戏物体的层级关系。

使用起来也很简单

比如:找一级子物体的第一个物体

1

Transform child1 = transform.GetChild(0);

找一级子物体的第一个物体的第三个子物体

1

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

使用方式:几个层级就几个GetChild(),参数就是当前层级的第几个物体(从0开始)

使用拓展:

遍历子物体:

1

2

3

4

for (int i = 0; i < transform.childCount; i++)

{

Debug.Log(transform.transform);

}

获取当前物体的父物体transform.parent

获取当前物体的根物体transform.root

transform.GetChild()使用总结:

  • 以自身为基础,查找子物体(注意索引从0开始,写多报错)

  • 可以使用transform.parent.parent 的形式无限向上,然后再GetChild(),就达到了查找父层级或更高层级物体的目的

  • 弊端是依赖游戏物体的层级关系,使用时需确保层级关系相对稳定。若不稳定会导致每次修改游戏体时还要修改代码,这就加大了工作量了。

猜你喜欢

转载自blog.csdn.net/qq_27866743/article/details/128997262
今日推荐