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); */