unity 查找物体的方法(包括隐藏物体)
一般而言,我们在游戏中寻找物体可以使用
GameObject.Find(),GameObject.FindGameObjectWithTag(),FindObjectOfType()等这方式,在游戏运行的过程中,这几种方法各自都能运行的良好(有效率上的区别,我没有做过测试),但是当我们在做一些编辑器扩展的时候,我们遇到的一些情况这些方法就不能处理了,比如寻找场景中的隐藏物体:
这个时候上述的方法就不能够使用,当然,可以通过transform.Find()去寻找一个父物体下的所有包括隐藏的物体,但是有局限性,只能寻找已显示物体的子物体,其子物体的子物体不能够查询到。
如果想要找到场景内所有的隐藏物体,我们可以使用Resources.FindObjectsOfTypeAll(),这个方法,在unity的官方API上有示例代码:
(返回场景中的所有物体)
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
public class ExampleScript : MonoBehaviour
{
List<GameObject> GetAllObjectsOnlyInScene()
{
List<GameObject> objectsInScene = new List<GameObject>();
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<GameObject> FindObjects(string tag)
{
List<GameObject> gameObjects = new List<GameObject>();
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
下一篇: 阿亚库乔战役:南美独立战争的胜利