Unity3d - 在播放模式下加载特定场景

Unity3d - Load a specific scene on play mode

好的,我正在做一个有主菜单和 10 个级别的小项目。有时我会编辑不同的关卡,并想尝试一下,但是我得到的是 NullPointerException,因为我的关卡依赖于主菜单中的某些变量才能使关卡正常工作,这意味着我必须更改我的关卡, 然后加载我的主菜单并从那里播放。

是否可以在 Unity 编辑器中执行某些操作,以便在您点击“播放”时默认加载特定场景,而不是您所在的场景?

我显然可以将其解决为

public bool goToMenu; //set this to true in my levels through inspector

Start()
{
    if (goToMenu)
        //then load main menu
}

但如果有一种方法可以设置在点击播放模式时加载默认级别,那将非常方便。我查看了首选项,但找不到任何内容。

谢谢!

这是 Unity 中众所周知的基本问题。

很遗憾没有好的解决方案

当您在游戏引擎中单击“播放”时,它当然应该跳转到您的预加载场景并从那里“播放”。

不幸的是,在 Unity 中不会发生这种情况。

每位有经验的 Unity 工程师都建议不要尝试将其自动化。但如果你必须...

/* 
ONLY FOR USE DURING DEVELOPMENT IN THE EDITOR
ONLY FOR USE DURING DEVELOPMENT IN THE EDITOR
ONLY FOR USE DURING DEVELOPMENT IN THE EDITOR

MUST RUN FIRST USING "SCRIPT EXECUTION ORDER" system
MUST RUN FIRST USING "SCRIPT EXECUTION ORDER" system
MUST RUN FIRST USING "SCRIPT EXECUTION ORDER" system

YOU MUST REMOVE THIS SCRIPT BEFORE BUILDING TO PRODUCTION
YOU MUST REMOVE THIS SCRIPT BEFORE BUILDING TO PRODUCTION
YOU MUST REMOVE THIS SCRIPT BEFORE BUILDING TO PRODUCTION
*/

using UnityEngine;
public class DevPreload:MonoBehaviour {

    void Awake() {

        GameObject check = GameObject.Find("__app");
        // "__app" is one of your DDOL gameobject in preload scene
        if (check==null)
            SceneManagement.SceneManager.LoadScene("_preload");
        }
    
    }

秘诀在于使用

Unity 的脚本执行顺序系统

只要在任何东西运行之前有那个脚本它就会做你想做的事。

但是 - 请注意,脚本执行顺序系统是一个非常糟糕的工程理念,没有人使用它,因为它太古怪了。

这个“技巧”是!!唯一的!!供开发期间使用。保持清醒!

我制作了这个简单的脚本,当您按下“播放”时,它会在构建设置中加载索引 0 处的场景。我希望有人觉得它有用。

它检测何时按下播放按钮并加载场景。然后,一切恢复正常。

哦!并且它会在打开 Unity 和编译脚本后自动执行,所以不用担心执行它。只需将其放在编辑器文件夹中即可。

#if UNITY_EDITOR
using UnityEditor;
using UnityEditor.SceneManagement;

[InitializeOnLoadAttribute]
public static class DefaultSceneLoader
{
    static DefaultSceneLoader(){
        EditorApplication.playModeStateChanged += LoadDefaultScene;
    }

    static void LoadDefaultScene(PlayModeStateChange state){
        if (state == PlayModeStateChange.ExitingEditMode) {
            EditorSceneManager.SaveCurrentModifiedScenesIfUserWantsTo ();
        }

        if (state == PlayModeStateChange.EnteredPlayMode) {
            EditorSceneManager.LoadScene (0);
        }
    }
}
#endif

将 wiki 中的 SceneAutoLoader 脚本放入编辑器文件夹中。它向 select 自动加载的场景添加了一个菜单,然后在您点击“播放”时始终加载该场景。

最简单的方法是将第 0 个场景设置为默认播放模式场景:

[InitializeOnLoad]
public class EditorInit
{
    static EditorInit()
    {
        var pathOfFirstScene = EditorBuildSettings.scenes[0].path;
        var sceneAsset = AssetDatabase.LoadAssetAtPath<SceneAsset>(pathOfFirstScene);
        EditorSceneManager.playModeStartScene = sceneAsset;
        Debug.Log(pathOfFirstScene + " was set as default play mode scene");
    }
}

这是我编写的编辑器脚本,它完全符合您的要求。 https://github.com/CSaratakij/SceneSelector 它具有 UI 到 select 特定场景和进入播放模式时在构建设置中打开第一个场景的选项。 可能对未来的访客有用。