📌  相关文章
📜  unity 获取所有游戏对象 (1)

📅  最后修改于: 2023-12-03 15:05:45.403000             🧑  作者: Mango

Unity 获取所有游戏对象

在 Unity 中,游戏对象是场景中的所有实体。获取所有游戏对象很重要,可以用于很多场景,例如对象池、自动化测试等。本文将介绍如何在 Unity 中获取所有游戏对象。

使用 GameObject.FindObjectsOfType

GameObject.FindObjectsOfType 方法可以获取场景中所有已实例化的游戏对象。这个方法需要一个游戏对象类型作为参数,例如:

GameObject[] allObjects = GameObject.FindObjectsOfType<GameObject>();

但是这个方法不仅会返回运行时创建的对象,还会包含 Unity 编辑器中的预制体,可能就不是你所需要的结果。

使用 Scene.GetRootGameObjects

Scene.GetRootGameObjects 方法可以获取场景中所有根游戏对象。与 GameObject.FindObjectsOfType 不同的是,这个方法只会返回运行时创建的对象,可以保证结果的正确性。这个方法需要一个场景作为参数,例如:

Scene currentScene = SceneManager.GetActiveScene();
GameObject[] allObjects = currentScene.GetRootGameObjects();
遍历场景中所有游戏对象

除了上面两种方法,我们还可以遍历场景中所有游戏对象。这个方法可以用于自定义筛选条件,例如只获取某个特定标签的对象。这个方法需要使用 Unity 提供的 Object 类中的 FindObjectsOfTypeAll 方法,例如:

GameObject[] allObjects = (GameObject[])FindObjectsOfTypeAll(typeof(GameObject));

注意,这个方法会返回所有场景中的对象,包括未激活的对象。如果要获取激活的对象,需要筛选一遍,例如:

List<GameObject> activeObjects = new List<GameObject>();
foreach (GameObject obj in allObjects)
{
    if (obj.activeInHierarchy)
    {
        activeObjects.Add(obj);
    }
}
总结

总之,Unity 中获取所有游戏对象有多种方法。需要根据场景和需求选择合适的方法,才能得到正确的结果。