这个问题可能有点宽泛,但考虑到Phaser 3,它仍然取决于您的菜单服务的目的。
我认为大多数游戏都有一个主菜单,通常在游戏开始时调用,然后不会再次调用。
如果这是一个游戏内菜单,可以更改设置或重置/重新启动游戏的一部分,则将重定向到完全不同的场景可能没有意义。
随着Phaser 3对多个场景的支持 -
Dev Log #119和
Dev Log #121可能是最好的当前信息来源 - 另一个选项是在当前场景中启动新场景来处理此事。
但是,如果这真的只是UI,那么就可以创建一个覆盖层,而不是生成整个场景。
如果您担心性能,可以考虑是否需要调用整个菜单,或者简化菜单是否有效。此外,请确保在进入菜单和主游戏之前预加载资产。
我个人使用引导程序 > 预加载程序 > 启动画面 > 主菜单 > 主游戏场景的方式进行编程,其中预加载程序会加载我需要的大部分资源。这种方式的劣势在于初始加载时间较长,但是之后几乎没有加载时间。
场景转换方面,在
我的起始模板中,我会在创建场景时将其添加到场景管理器中,然后通过“start”过渡到第一个场景。
this.scene.add(Boot.Name, Boot)
this.scene.add(Preloader.Name, Preloader)
this.scene.add(SplashScreen.Name, SplashScreen)
this.scene.add(MainMenu.Name, MainMenu)
this.scene.start(Boot.Name)
然后我只需根据需要不断启动下一个场景。
this.scene.start(Preloader.Name)
对于另一个使用多个场景的游戏,我最终创建了以下函数(TypeScript)来处理:
private sleepPreviousParallelScene(sceneToStart: string): Phaser.Scene {
if (this.uiSceneRunning !== sceneToStart) {
if (this.uiSceneRunning !== "") {
this.scene.get(this.uiSceneRunning).scene.sleep();
}
const newScene = this.scene.get(sceneToStart);
newScene.scene.start();
this.scene.bringToTop(sceneToStart);
this.uiSceneRunning = sceneToStart;
return newScene;
} else {
return this.scene.get(this.uiSceneRunning);
}
}
在我使用这个的游戏中,我试图复制一个标准的选项卡界面(就像上面的Dev Logs中看到的文件夹式界面)。