import { director } from 'cc'; import { BUNDLE_ID } from '../../define/ResDefine'; import { ResourceManager } from '../resource/ResourceManager'; export enum SceneId { Launch = 'Launch', Lobby = 'Lobby', Game = 'Game', } const SceneRes = { [SceneId.Lobby]: BUNDLE_ID.Lobby, [SceneId.Game]: BUNDLE_ID.Lobby } export class SceneNavigator { private navigating = false; constructor(private readonly resLoader: ResourceManager) { } async preload(scene: SceneId): Promise { const bundleName = SceneRes[scene]; if (bundleName) { await this.resLoader.loadBundle(bundleName); } return new Promise((resolve, reject) => { director.preloadScene(scene, (error) => { if (error) { console.log('preload scene error: ', error); reject(error); return; } resolve(); }); }); } async go(scene: SceneId): Promise { if (this.navigating || director.getScene()?.name === scene) return; this.navigating = true; try { const bundleName = SceneRes[scene]; if (bundleName) { await this.resLoader.loadBundle(bundleName); } await new Promise((resolve, reject) => { director.loadScene(scene, (error) => { if (error) { console.log('load scene error: ', error); reject(error); return; } resolve(); }); }); } finally { this.navigating = false; } } goToLobby(): Promise { return this.go(SceneId.Lobby); } goToGame(): Promise { return this.go(SceneId.Game); } }