引入界面管理器 UIManager 的缘由
完成模拟登录后,我们将控制权交给了 Match3Entry,Match3Entry 通过以下方式打开三消界面:
ResManager.getInstance().loadPrefab("Match3BN", "Match3UI", prefab => {
let match3Node = instantiate(prefab);
this.node.addChild(match3Node);
match3Node.getComponent(UITransform).setContentSize(G_VIEW_SIZE.clone());
});
1. 创建 Match3UI 脚本组件并绑定到 Match3UI.prefab 预制体
1.1 这里我们先在 Match3/Script 下创建一个 Match3UI 的脚本组件,用于和预制体绑定:
移除 update 方法,在 start 方法中添加一条控制台打印,内容如下:
import { _decorator, Component, Node } from 'cc';
const { ccclass, property } = _decorator;
@ccclass('Match3UI')
export class Match3UI extends Component {
start() {
console.log(`主玩法界面`)
}
}
1.2 将该脚本绑定到预制体上
这类操作后续省略,见图:
1.3 运行测试
控制台输出了:“主玩法界面” 的字样,符合预期
2. 打开界面的方式需要重构
之前打开界面的方式其实是不方便的: 开发侧需要先调用 ResManager 加载资源,然后才创建实例,并添加到目标节点。(说白了这种方式是:每次在使用的时候,需要先考虑依赖,然后才能执行目标,对心智的负担是很重的)
我们从需求侧入手思考更直观的调用方式是什么?
我希望的方式凝练出来就是一句话:打开界面!(界面依赖的资源是确定的,请你自动帮我加载好!别让我每次使用的时候调用!)
所以我希望的调用方式应该是这样的:
import { _decorator, Component } from 'cc';
import { UIManager } from '../../fw/ui/UIManager';
import { Match3UI } from './Match3UI';
const { ccclass } = _decorator;
@ccclass('Match3Entry')
export class Match3Entry extends Component {
async init() {
UIManager.getInstance().open(Match3UI)
}
}
因此我们将要引入 UIManager 这个对象(假设其位置在 fw/ui/UIManager.ts),来控制界面的打开操作。这将在下一节实现。








了个


欢迎试玩~