添加主游戏场景入口
现在我们打开《羊了个羊》的逻辑是写在登录界面。这个是不正确的。正确的流程是:
graph TD
A[登录成功] --> B[移交控制权] --> C[打开三消主玩法界面]
因此我们添加一个 Match3Entry 用来接管登录成功后的管理权
1、创建 Match3Entry.ts,并提供 init 方法接口用于接管控制权限
1.1 在 Match3 目录下新建 Script 文件夹,在 Script 文件夹下新建 Match3Entry.ts 脚本:
1.2 Match3Entry.ts 实现如下:
import { _decorator, Component, instantiate, UITransform } from 'cc';
import { G_VIEW_SIZE } from '../../Boost';
import { ResManager } from '../../fw/res/ResManager';
const { ccclass } = _decorator;
@ccclass('Match3Entry')
export class Match3Entry extends Component {
async init() {
ResManager.getInstance().loadPrefab("Match3BN", "Match3UI", prefab => {
let match3Node = instantiate(prefab);
this.node.addChild(match3Node);
match3Node.getComponent(UITransform).setContentSize(G_VIEW_SIZE.clone());
});
}
}
其中 init 方法用于接管登录成功后的控制权。目前的控制逻辑主要是打开 Match3UI 界面。
1.3 修改 LoginEntry.ts 中的代码
import { _decorator, Component } from 'cc';
import { AudioManager } from '../../fw/audio/AudioManager';
import { ResManager } from '../../fw/res/ResManager';
const { ccclass } = _decorator;
@ccclass('LoginEntry')
export class LoginEntry extends Component {
start() {
// 加载背景音乐后播放
AudioManager.getInstance().playMusic({
b: "Match3BN",
l: "Audio/bgm"
})
this.scheduleOnce(() => {
ResManager.getInstance().loadBundle("Match3BN", () => {
let match3Entry = this.node.addComponent("Match3Entry");
(match3Entry as any).init();
})
}, 1)
}
}
2、注意事项
2.1 子包的脚本被 require 的时机
子包 Match3BN 在loadBundle 完成的时候,包中的脚本将被 require,Match3Entry 这样的组件就被注册到引擎的组件管理模块中。因此就可以通过 addComponent("Match3Entry")
的形式正确的添加组件。
2.2 注意 Match3Entry 组件的添加方式
在 LoginEntry 中,为什么要用 addComponent("Match3Entry")
的形式,而不是用下面的形式?
import { Match3Entry } from '../../Match3/Script/Match3Entry';
// ...省略
let match3Entry = this.node.addComponent(Match3Entry);
// ...省略
这是因为 LoginEntry.ts 脚本所在的Asset Bundle 包的优先级高于 Match3BN ,因此这样的引用是错误的。
会导致
1、加载依赖关系错乱;
2、微信小游戏、抖音小游戏中 Match3BN (是小游戏分包)的脚本将被错误的打包到 LoginBN 中。
重新运行,一切照旧!