繁体   English   中英

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
}

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

谢谢!

我制作了这个简单的脚本,当您按下 Play 时,它会在构建设置中的索引 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脚本放入 Editor 文件夹中。 它添加了一个菜单来选择自动加载的场景,然后在您点击播放时始终加载该场景。

最简单的方法是将第 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");
    }
}

这是 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 的脚本执行顺序系统

只需在执行任何操作之前运行该脚本,它就会执行您想要的操作。

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

这个“把戏”是!!只有!! 在开发过程中使用。 保持清醒!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM