Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何按场景名称获取场景中的游戏对象列表,但只能获取一次?_C#_Unity3d - Fatal编程技术网

C# 如何按场景名称获取场景中的游戏对象列表,但只能获取一次?

C# 如何按场景名称获取场景中的游戏对象列表,但只能获取一次?,c#,unity3d,C#,Unity3d,内部布局按钮: if (GUILayout.Button("Test")) { var selection = Selection.gameObjects.ToList(); var scenesNames = ScriptsManager.ListScenes(); List<Transform> objectsInScene = new List<Transform>(); if (prefab != null &&

内部布局按钮:

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]));
                }
            }
        }
if(GUILayout.Button(“Test”))
{
var selection=selection.gameObjects.ToList();
var scenesNames=ScriptsManager.ListScenes();
List objectsInScene=new List();
if(预置!=null&&selection.Count>0)
{
对于(var i=selection.Count-1;i>=0;--i)
{
选择的var=选择[i];
对于(int x=0;x
以及GetSceneObject方法:

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;
}
公共静态列表GetSceneObject(字符串sceneName)
{
场景s=SceneManager.GetSceneByName(sceneName);
List childs=新列表();
GameObject[]gameObjects=s.GetRootGameObjects();
对于(inti=0;i
在方法
GetSceneObjects
中,我试图过滤掉相同的对象,但它不起作用

例如,如果在Guillayout按钮中,我在层次结构中选择了一个场景中的3个对象和另一个场景中的1个对象,那么我将在ObjectsSinScene列表中获得16个对象

但这是错误的

我在第一个场景中选择的3个对象都来自同一个场景,因此它应该只向列表中添加5个对象一次,因为第一个场景总共有5个对象。但是,相反,它添加了15个对象,因为它的“选定对象”使它获得了场景中的所有5个对象

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


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

您做得不对,但快速修复方法是更改

List objectsInScene=new List();
to
HashSet objectsInScene=new HashSet();

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


最后,如果需要列表实例,您可以执行
objectsInScene.ToList()

您做得不对,但快速修复方法是更改

List objectsInScene=new List();
to
HashSet objectsInScene=new HashSet();

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


最后,您可以执行
objectsInScene.ToList()
如果需要列表实例。

另外,停止使用OnGui并开始使用。@Draco18s我可以将新UI与EditorWindow脚本一起使用?我不知道您正在编写编辑器窗口脚本。另外,停止使用OnGui并开始使用。@Draco18s我可以将新UI与EditorWindow脚本一起使用?我不知道您正在编写编辑器窗口脚本。