248 lines
6.5 KiB
TypeScript
248 lines
6.5 KiB
TypeScript
import { _decorator, Component, Node, Label, Button, find } from 'cc';
|
|
import { UIBase } from './UIBase';
|
|
import { UIMgr } from './UIMgr';
|
|
|
|
const { ccclass, property } = _decorator;
|
|
|
|
/**
|
|
* UI使用示例
|
|
*
|
|
* 本文件展示如何使用UI系统:
|
|
* 1. 创建自定义UI类
|
|
* 2. 加载和显示UI
|
|
* 3. 更新UI
|
|
* 4. 卸载UI
|
|
*/
|
|
|
|
// ============================================
|
|
// 示例1: 简单的UI类
|
|
// ============================================
|
|
|
|
/**
|
|
* 登录UI示例
|
|
*/
|
|
export class UILogin extends UIBase {
|
|
/**
|
|
* 返回UI预制体路径
|
|
*/
|
|
onGetUrl(): string {
|
|
return 'UI/Login/UILogin';
|
|
}
|
|
|
|
/**
|
|
* UI初始化
|
|
*/
|
|
onStart(params?: any): void {
|
|
console.log('[UILogin] 初始化', params);
|
|
|
|
// 获取节点
|
|
const node = this.getNode();
|
|
if (!node) return;
|
|
|
|
// 查找按钮并绑定事件
|
|
const btnLogin = node.getChildByName('BtnLogin');
|
|
if (btnLogin) {
|
|
const button = btnLogin.getComponent(Button);
|
|
if (button) {
|
|
button.node.on(Button.EventType.CLICK, this.onLoginClick, this);
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* UI清理
|
|
*/
|
|
onEnd(): void {
|
|
console.log('[UILogin] 清理');
|
|
|
|
// 解绑事件
|
|
const node = this.getNode();
|
|
if (!node) return;
|
|
|
|
const btnLogin = node.getChildByName('BtnLogin');
|
|
if (btnLogin) {
|
|
btnLogin.off(Button.EventType.CLICK, this.onLoginClick, this);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 登录按钮点击
|
|
*/
|
|
private onLoginClick(): void {
|
|
console.log('[UILogin] 点击登录按钮');
|
|
// 执行登录逻辑...
|
|
}
|
|
}
|
|
|
|
// ============================================
|
|
// 示例2: 带更新的UI类
|
|
// ============================================
|
|
|
|
/**
|
|
* 游戏主界面UI示例
|
|
* 包含倒计时等需要每帧更新的逻辑
|
|
*/
|
|
export class UIMain extends UIBase {
|
|
private _timeLeft: number = 60;
|
|
private _labelTime: Label | null = null;
|
|
|
|
onGetUrl(): string {
|
|
return 'UI/Main/UIMain';
|
|
}
|
|
|
|
onStart(): void {
|
|
console.log('[UIMain] 初始化');
|
|
|
|
const node = this.getNode();
|
|
if (!node) return;
|
|
|
|
// 获取时间Label
|
|
const timeNode = node.getChildByName('LabelTime');
|
|
if (timeNode) {
|
|
this._labelTime = timeNode.getComponent(Label);
|
|
}
|
|
|
|
this.updateTimeDisplay();
|
|
}
|
|
|
|
/**
|
|
* 每帧更新
|
|
*/
|
|
onUpdate(dt: number): void {
|
|
// 更新倒计时
|
|
this._timeLeft -= dt;
|
|
if (this._timeLeft < 0) {
|
|
this._timeLeft = 0;
|
|
}
|
|
|
|
this.updateTimeDisplay();
|
|
}
|
|
|
|
/**
|
|
* 更新时间显示
|
|
*/
|
|
private updateTimeDisplay(): void {
|
|
if (this._labelTime) {
|
|
this._labelTime.string = `剩余时间: ${Math.floor(this._timeLeft)}s`;
|
|
}
|
|
}
|
|
}
|
|
|
|
// ============================================
|
|
// 示例3: 在Component中使用UI系统
|
|
// ============================================
|
|
|
|
/**
|
|
* UI管理器使用示例组件
|
|
*/
|
|
@ccclass('UIMgrExample')
|
|
export class UIMgrExample extends Component {
|
|
|
|
start() {
|
|
// 设置UI根节点
|
|
const canvas = find('Canvas');
|
|
if (canvas) {
|
|
UIMgr.getInstance().setUIRoot(canvas);
|
|
}
|
|
|
|
// 演示UI加载和使用
|
|
this.testUISystem();
|
|
}
|
|
|
|
update(dt: number) {
|
|
// 每帧更新UI系统
|
|
UIMgr.getInstance().update(dt);
|
|
}
|
|
|
|
/**
|
|
* 测试UI系统
|
|
*/
|
|
private async testUISystem() {
|
|
console.log('========== UI系统测试开始 ==========');
|
|
|
|
try {
|
|
// 1. 加载登录UI
|
|
console.log('\n--- 测试1: 加载登录UI ---');
|
|
const loginUI = await UIMgr.getInstance().load(UILogin, {
|
|
username: 'player1'
|
|
});
|
|
console.log('登录UI加载成功:', loginUI);
|
|
|
|
// 2. 检查UI是否存在
|
|
console.log('\n--- 测试2: 检查UI状态 ---');
|
|
console.log('是否已加载:', UIMgr.getInstance().has(UILogin));
|
|
console.log('是否显示中:', loginUI.isShowing());
|
|
|
|
// 3. 隐藏和显示UI
|
|
console.log('\n--- 测试3: 隐藏和显示 ---');
|
|
setTimeout(() => {
|
|
console.log('隐藏登录UI');
|
|
UIMgr.getInstance().hide(UILogin);
|
|
}, 2000);
|
|
|
|
setTimeout(() => {
|
|
console.log('显示登录UI');
|
|
UIMgr.getInstance().show(UILogin);
|
|
}, 4000);
|
|
|
|
// 4. 加载主界面UI
|
|
console.log('\n--- 测试4: 加载主界面UI ---');
|
|
setTimeout(async () => {
|
|
const mainUI = await UIMgr.getInstance().load(UIMain);
|
|
console.log('主界面UI加载成功:', mainUI);
|
|
console.log('当前UI数量:', UIMgr.getInstance().getUICount());
|
|
}, 6000);
|
|
|
|
// 5. 卸载UI
|
|
console.log('\n--- 测试5: 卸载UI ---');
|
|
setTimeout(() => {
|
|
console.log('卸载登录UI');
|
|
UIMgr.getInstance().unload(UILogin);
|
|
console.log('当前UI数量:', UIMgr.getInstance().getUICount());
|
|
}, 8000);
|
|
|
|
// 6. 卸载所有UI
|
|
console.log('\n--- 测试6: 卸载所有UI ---');
|
|
setTimeout(() => {
|
|
console.log('卸载所有UI');
|
|
UIMgr.getInstance().unloadAll();
|
|
console.log('当前UI数量:', UIMgr.getInstance().getUICount());
|
|
}, 10000);
|
|
|
|
} catch (error) {
|
|
console.error('UI系统测试失败:', error);
|
|
}
|
|
|
|
console.log('\n========== UI系统测试完成 ==========');
|
|
}
|
|
}
|
|
|
|
// ============================================
|
|
// 使用说明
|
|
// ============================================
|
|
|
|
/**
|
|
* 基本使用流程:
|
|
*
|
|
* 1. 创建UI类:
|
|
* export class MyUI extends UIBase {
|
|
* onGetUrl(): string {
|
|
* return 'UI/MyUI';
|
|
* }
|
|
* }
|
|
*
|
|
* 2. 设置UI根节点:
|
|
* UIMgr.getInstance().setUIRoot(canvas);
|
|
*
|
|
* 3. 加载并显示UI:
|
|
* const ui = await UIMgr.getInstance().load(MyUI);
|
|
*
|
|
* 4. 在主循环中更新:
|
|
* update(dt: number) {
|
|
* UIMgr.getInstance().update(dt);
|
|
* }
|
|
*
|
|
* 5. 卸载UI:
|
|
* UIMgr.getInstance().unload(MyUI);
|
|
*/
|