如何通过场景名称(仅一次)获取场景中的游戏对象列表?

时间:2018-08-20 21:33:22

标签: c# unity3d

内部GUILayout按钮:

if (GUILayout.Button("Test"))
{
    var selection = Selection.gameObjects.ToList();
    var scenesNames = ScriptsManager.ListScenes();
    List<Transform> objectsInScene = new List<Transform>();

    if (prefab != null && selection.Count > 0)
    {
        for (var i = selection.Count - 1; i >= 0; --i)
        {
            var selected = selection[i];
            for (int x = 0; x < scenesNames.Count; x++)
            {
                if (selected.scene.name == scenesNames[x])
                {
                    objectsInScene.AddRange(ScriptsManager.GetSceneObjects(scenesNames[x]));
                }
            }
        }

以及方法GetSceneObjects:

public static List<Transform> GetSceneObjects(string sceneName)
{
    Scene s = SceneManager.GetSceneByName(sceneName);

    List<Transform> childs = new List<Transform>();
    GameObject[] gameObjects = s.GetRootGameObjects();

    for (int i = 0; i < gameObjects.Length; i++)
    {
        if (!childs.Contains(gameObjects[i].transform))
            childs.Add(gameObjects[i].transform);
        foreach (Transform go in gameObjects[i].transform)
        {
            if (!childs.Contains(go))
                childs.Add(go);
        }
    }

    return childs;
}

在方法GetSceneObjects中,我试图过滤出相同的对象,但是它不起作用。

例如,如果我在GUILayout按钮中从一个场景中选择了3个对象,而从另一个场景中选择了1个对象,那么我将在List objectsInScene中获得16个对象。

但这是错误的。

我在第一个场景中选择的3个对象全部来自同一场景,因此,由于第一个场景总共具有5个对象,因此它应该仅将5个对象添加到列表中。但是,相反,它添加了15个对象,因为它被选中的对象使它可以获取场景中的所有5个对象。

最后,我有一个包含16个对象的列表,但应该只列出6个对象。

第一个场景有5个对象,第二个场景有1个对象。

1 个答案:

答案 0 :(得分:4)

您做错了,但快速的解决方法是更改​​

List<Transform> objectsInScene = new List<Transform>();HashSet<Transform> objectsInScene = new HashSet<Transform>();

objectsInScene.AddRange(ScriptsManager.GetSceneObjects(scenesNames[x]));objectsInScene.UnionWith(ScriptsManager.GetSceneObjects(scenesNames[x]));

最后,如果需要List实例,则可以执行objectsInScene.ToList()