我可以在Unity编辑器中以编程方式加载场景吗?

本鲁宾

我在2D游戏中使用A *寻路算法(据我了解,Unity Nav Meshes在2D中不起作用)。我希望能够为我的所有场景预先计算出导航网格,并将其保存在资源文件中,以便在播放器进入新场景时可以加载。无需记住要为每个场景单击“计算”-并记得在对导航网格进行更改后要重新计算所有场景-我希望能够以编程方式让Unity编辑器遍历每个场景并计算网格。

有没有一种方法可以在Unity编辑器中创建一个命令,该命令将迭代地打开编辑器中的每个场景并在该场景中的上运行方法MonoBehaviour另外,还有另一种方法可以完成我想做的事情吗?

雨果

是的你可以!

在editmode中,您不能使用,SceneManager但必须使用EditorSceneManager


首先,您需要迭代的场景。

例如,可能是在Inspector中public static带有列表的字段SceneAsset,您可以在其中简单地引用场景

public static List<SceneAsset> Scenes = new List<SceneAsset>();

或者您可以通过脚本获取它们,例如仅用于使用添加到构建设置中的场景 EditorBuildSettings.scenes

List<EditorBuildSettingsScene> Scenes = EditorBuildSettings.scenes;

对于两者,您都可以获取场景路径列表,例如使用LinQSelect(这基本上是foreach循环的一种快捷方式),AssetDatabase.GetAssetPath例如

List<string> scenePaths = Scenes.Select(scene => AssetDatabase.GetAssetPath(scene)).ToList();

对于EditorBuildSettingsSceneEditorBuildSettings.scenes你也可以简单地使用

List<string> scenePaths = Scenes.Select(scene => scene.path).ToList();

现在你可以在他们所有的迭代,并用做你的东西EditorSceneManager.OpenSceneEditorSceneManager.SaveScene并且EditorSceneManager.CloseScene(如果你需要它AssetDatabase.SaveAssets

foreach(string scenePath in scenePaths)
{
    // Open a scene e.g. in single mode
    var currentScene = EditorSceneManager.OpenScene(scenePath);

    /* Do your calculation for currentScene */

    // Don't know if it makes changes to your scenes .. if not you can probably skip this
    EditorSceneManager.SaveScene(currentScene);

    // Finally Close and remove the scene
    EditorSceneManager.CloseScene(currentScene, true);
}

// you might be doing changes to an asset you want to save when done
AssetDatabase.SaveAssets();

开始之前,您可能应该要求使用保存当前打开的场景。 EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo

if(EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo())
{
    // Saved => the foreach loop here
}
else
{
    // aborted => do nothing
}

为了最终启动该方法,最简单的方法是添加一个 [MenuItem]

public static class Calculation
{
    [MenuItem("YourMenu/RunCalculation")]
    public static void RunCalculation()
    {
        // all the before mentioned snippets here
        // depending how exactly you want to do it
    }
}

这将在Unity Editor的顶部菜单栏中添加一个YourMenu只有一个条目的新菜单RunCalculation

注意:
由于这使用了很多EditorSceneManager仅存在于UnityEditor名称空间中的类型(等),因此您应该将整个脚本放置在一个Editor文件夹中(以便在最终版本中将其忽略),或者使用诸如

#if UNITY_EDITOR
    // ... code here
#endif

因此在构建中,代码也将被忽略。


请注意,到目前为止,我假设您也以editmode进行了计算。问题是,如果此计算依赖于任何方法Start某种Awake方法,则必须在运行计算之前从该编辑器脚本手动调用它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

以编程方式在场景编辑器中更改纹理

我可以阻止加载 RCP 编辑器吗

在编辑器进入Unity的播放模式之前,是否可以更改要加载的场景?

Unity编辑器如何显示场景中的变换

我可以在 Unity 编辑器中一次编辑多个动画过渡吗?

我可以以编程方式捕获场景的快照吗?

SKVideoNode 与场景编辑器兼容吗?

我们可以从SmartEdit的组件编辑器中编辑CMSNavigationNode吗?

加载场景时,场景仅在某些情况下在编辑器中崩溃

在Visual Studio中,有什么方法可以在编辑器中以编程方式修改选定的编辑器文本?代码段?宏?

加载小场景时Unity编辑器/独立构建崩溃

Unity在编辑器播放模式下同步加载场景

我可以设置ABAP编辑器的背景颜色吗?

是否可以将编程中的外部文件/类加载到位于工作空间之外的 eclipse 编辑器中?

Eclipse RCP-我可以在后台线程中打开编辑器吗?

我们可以从原子文本编辑器中打开gitbash吗

我可以在Ace编辑器中打开HTML文件吗?

是否可以在Unity编辑器中显示静态字段?

Unity 编辑器:是否可以创建易于编辑的快捷方式?

以编程方式添加的 SpritekitNode 不会触发 touchesBegan 而通过场景编辑器添加的相同 spritekitnode 工作

在 Pine 编辑器中可以吗?

如何从sks文件加载节点,然后应用场景编辑器中定义的动作

在哪里可以以编程方式获取IntelliJ IDEA代码编辑器的背景色?

我可以使用我的iOS应用程序中可用的默认图像编辑器吗?

SpriteKit场景编辑器

在IBM Watson对话中的JSON编辑器中以编程方式定义next_step

我可以使用文本编辑器来编辑GCode吗?

以编程方式在Eclipse PDE View中打开编辑器

eclipse插件:如何在编辑器中以编程方式选择文本?