当前位置: 移动技术网 > 移动技术>移动开发>IOS > unity 查找物体的方法(包括隐藏物体)

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

2020年07月15日  | 移动技术网移动技术  | 我要评论

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网