unity 查找所以物体_unity 查找物体的方法(包括隐藏物体)

一般而言,我们在游戏中寻找物体可以使用

GameObject.Find(),GameObject.FindGameObjectWithTag(),FindObjectOfType()等这方式,在游戏运行的过程中,这几种方法各自都能运行的良好(有效率上的区别,我没有做过测试),但是当我们在做一些编辑器扩展的时候,我们遇到的一些情况这些方法就不能处理了,比如寻找场景中的隐藏物体:

a0d686185815409ecce953ebeebbe5df.png

这个时候上述的方法就不能够使用,当然,可以通过transform.Find()去寻找一个父物体下的所有包括隐藏的物体,但是有局限性,只能寻找已显示物体的子物体,其子物体的子物体不能够查询到。

如果想要找到场景内所有的隐藏物体,我们可以使用Resources.FindObjectsOfTypeAll(),这个方法,在unity的官方API上有示例代码:

(返回场景中的所有物体)

using System.Collections.Generic;

using UnityEngine;

using UnityEditor;

public class ExampleScript : MonoBehaviour

{

List GetAllObjectsOnlyInScene()

{

List objectsInScene = new List();

foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)) as GameObject[])

{

if (!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave))

objectsInScene.Add(go);

}

return objectsInScene;

}

}

官方API上说明,这种方法可以列出任何类型的已加载的Unity对象,包括游戏对象,预制体,材质,网格等等,它还会列出内部对象以及禁用对象,因此在使用的时候需要做一些处理。

在示例代码中,EditorUtility.IsPersistent方法用来检查是否查找对象存储在磁盘里,像是以资产形式存储的预制体,美术资源等等,会返回为true,如果是在场景中的物体,比如普通物体,和预制体的实例,则会返回为false。

hideFlags则是用来标记物体是否被隐藏、保存、是否可被修改。

有了官方的示范,我们便可以照葫芦画瓢做一些其他的操作,就比如官方给的方法返回的是场景中的全部物体,我们可以根据寻找物体的tag,名称,自定义寻找到的物体:

根据tag找到场景中的一组物体:

private static List FindObjects(string tag)

{

List gameObjects = new List();

foreach (GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)))

{

if (!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave))

{

if (go.tag == tag)

gameObjects.Add(go);

}

}

return gameObjects;

}

根据名称找到场景内的特定物体:

private static GameObject FindObject2(string name)

{

foreach(GameObject go in Resources.FindObjectsOfTypeAll(typeof(GameObject)))

{

if(!EditorUtility.IsPersistent(go.transform.root.gameObject) && !(go.hideFlags == HideFlags.NotEditable || go.hideFlags == HideFlags.HideAndDontSave))

{

if (go.name == name)

return go;

}

}

return null;

}

注:根据此方法得出的场景中的游戏对象列表,不是按照Hierarchy中的目录顺序。

这个方法需要引用unityEditor,因此在游戏逻辑中不能够用此方法。

本文地址:https://blog.csdn.net/weixin_43347688/article/details/107322746

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!


版权声明:本文为weixin_32769015原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。