gpt4 book ai didi

c# - 如何通过场景名称获取场景中的游戏对象列表但只有一次?

转载 作者:太空宇宙 更新时间:2023-11-03 20:54:30 25 4
gpt4 key购买 nike

内部 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个物体。

最佳答案

你做错了,但快速修复是改变

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

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

最后你可以做objectsInScene.ToList()如果需要 List 实例。

关于c# - 如何通过场景名称获取场景中的游戏对象列表但只有一次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51938787/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com