FairyGUI 超简单的UI框架

Laya使用fgui的超简单UI框架

使用场景:用于使用fgui进行layaUI开发的程序人员

整个框架分为3个模块,共有4个类:

  • FGUIManager :FGUI的管理类,继承于IUIManager 负责所有UI的打开关闭等事项
  • FUIBase :UI的管理基类,具体实现
  • IUIManager :FGUI的接口类 规定管理类的各个方法
  • UILayerType: UI 层级分类

FGUIManager管理类

import IUIManager from "./IUIManager";import { FUIBase } from "./FUIBase";import GameEntry from "../../GameEntry";/*** @ name:FGUIManager* @ desc:自动创建说明* @ user:By NUOLO* @ data: 2021-06-02 18:14*/export default class FGUIManager implements IUIManager {/****/constructor() {this.Init();}Init(): void {Laya.stage.addChild(fgui.GRoot.inst.displayObject);     //初始化FGUIthis.UIroot = fgui.GRoot.inst.displayObject;this.UIroot.width = Laya.stage.width;this.UIroot.height = Laya.stage.height;fgui.UIConfig.packageFileExtension = "fui";          //设置导出文件的拓展名  代码默认的拓展名为fui,可能于自身导出的拓展名不同 但最好这样做因为有些平台只认这种文件名this.UIDic = {};}/*** UI字典*/UIDic: { [name: string]: FUIBase<fgui.GComponent>};/*** UI的根节点*/private UIroot: Laya.Sprite;/*** 注入FUIBase */RigisterUIBase(name: string, ui: FUIBase<fgui.GComponent>): void {if (this.UIDic[name]) {console.log(name + "::字段已存在UI界面,请勿重复添加")return;}else {this.UIDic[name] = ui;}}CreateOrOpenPanel(name: string, data?:new () => FUIBase<fgui.GComponent> , isCloseOther?: boolean): FUIBase<any> {if (!this.UIroot) {this.Init();}if (this.UIDic[name]) {return this.OpenPanel(name, isCloseOther);}else {let cla = new data();if (fgui.UIPackage.addPackage(data['ResName']) == null) {console.log('资源包未加载,将进行自动加载');fgui.UIPackage.addPackage(data['ResName']);}// let com = fgui.UIPackage.createObject(data['UIpackName'], data['UIName'], cla.ClassType).asCom;let com =  fgui.UIPackage.createObjectFromURL(cla.ClassType.URL,cla.ClassType).asCom ;com.name = data['UIName'];fgui.GRoot.inst.addChild(com);com.makeFullScreen();com.sortingOrder = cla.LayerType;cla.MUI = com;cla.UIMgr = this;this.UIDic[name] = cla;cla.onAwake();cla.onEnable();return cla;}}OpenPanel(name: string, isCloseOther?: boolean): FUIBase<any> {if (isCloseOther) {for (let uiname in this.UIDic) {this.UIDic[uiname].Close();}}if (this.UIDic[name]) {let ui = this.UIDic[name];ui.Open();return ui;}else {console.error(name + "::字段在UI字典中不存在,请检查是否有误")return null;}}ClosePanel(name: string, toOpenWindow?: string): void {if (this.UIDic[name]) {let ui = this.UIDic[name];ui.Close();if (toOpenWindow != null) {this.OpenPanel(toOpenWindow);}}else {console.log(name + "::字段在UI字典中不存在,请检查是否有误")}}CloseAllPanel(): void {for (const key in this.UIDic) {this.UIDic[key].Close();}}GetUIPanel(name: string): any {if (this.UIDic[name]) {return this.UIDic[name] ;}else {console.log(name + "::字段在Ui字典中不存在,请检查")return null;}}DestoryUIPanel(name: string) {if (this.UIDic[name]) {this.UIDic[name].Destory();}else {console.log(name + "::字段在Ui字典中不存在,请检查")}}}

FUIBase

import AssetData from "../../Asset/AssetData";import Debug from "../../Debug/Debug";import GameEntry from "../../GameEntry";import IUIManager from "./IUIManager";import { UILayerType } from "./UILayerType";/*** @ name:FUIBase* @ desc:自动创建说明* @ user:By NUOLO* @ data: 2021-06-02 16:24*/export class FUIBase<T extends fgui.GComponent>  {/**需子类设置 导出包的路径 */public static ResName: string = "res/UIVSLoading";/**需子类设置 图集的数量 从0 开始 */public static AtliasCount: number = 1;public static UIName: string = "1";                     //UI的名字 要存在字典中public get UIName(): string { return FUIBase.UIName; }public set UIName(v: string) { FUIBase.UIName = v; }/** UI的层级  默认0级为最底层 */public LayerType: UILayerType = UILayerType.Normal;/**fgui 组件 */private m_uiComPonent: T;public get MUI(): T { return this.m_uiComPonent; }public set MUI(v: T) { this.m_uiComPonent = v;  }/**fgui 组件 */public ClassType: any;/**UI管理类 */private m_uimgr: IUIManager;public get UIMgr(): IUIManager { return this.m_uimgr; }public set UIMgr(v: IUIManager) { this.m_uimgr = v; }/*** 自动注册进UIManager*/public AutoRigisterToUIManager() {this.UIMgr.RigisterUIBase(this.UIName, this);}/*** 打开界面*/public Open() {this.onEnable();this.m_uiComPonent.visible = true;}/*** 关闭界面*/public Close() {this.onDisable();this.m_uiComPonent.visible = false;}/*** 销毁界面*/public Destory() {this.m_uiComPonent.dispose();}//#region fgui加载/*** 获取当前界面所对应的资源文件* @returns */public static GetLoadUIPackDic(): any[] {let urls = [];urls.push({ url: this.ResName + ".fui", type: Laya.Loader.BUFFER });urls.push({ url: this.ResName + "_atlas0.png", type: Laya.Loader.IMAGE });//加载纹理集if (this.AtliasCount >=1) {for (let i = 1; i <= this.AtliasCount; i++) {urls.push({ url: this.ResName + "_atlas0_" + i + ".png", type: Laya.Loader.IMAGE });}}return urls;}/*** 获取FGUI 二进制文件路径* @returns 对应路径*/public static GetUIByte(): string {return this.ResName + ".fui";}/*** 加载完成之后 将包添加到fgui包管理中*/public static AddPackage() {fgui.UIPackage.addPackage(this.ResName);}//#endregion//#region  功能/***  获得子节点* @param path 路径信息  s.b.v*/public FindChild<T extends fgui.GObject>(path: String): T {return this.m_uiComPonent.getChildByPath(path) as T;}/*** 添加事件监听* @param btn 点击按钮* @param callback 回调* @param args 传递数据*/public AddLinster(btn: fgui.GObject, callback, ...args) {btn.onClick(this, callback, args);}/*** 移除事件监听* @param btn 按钮* @param callback 回调*/public RemoveLinster(btn: fgui.GObject, callback) {btn.offClick(btn, callback);}//#endregion//#region 生命流程onAwake() {}        //onAwake 创建时调用onEnable() {}       //每次打开时调用,可自行拓展打开时的打开效果等功能onDisable() {}      //每次关闭时调用,可自行拓展关闭时的 所需调用的功能//#endregion}

IUIManager

import { FUIBase } from "./FUIBase";/*** @ name:IUIManager* @ desc:UI管理类的接口* @ user:By NUOLO* @ data: 2021-06-02 16:14*/export default interface IUIManager {/*** 初始化*/Init():void/*** UI字典*/UIDic: { [name: string]: FUIBase<any> };/*** 注入FUIBase */RigisterUIBase(name: string, ui: FUIBase<any>): void;/*** 自动创建 或者打开 界面 注意:创建UI是异步操作的* @param name 名字* @param isCloseOther 是否关闭其他界面* @param data 数据*/CreateOrOpenPanel(name: string, data?:any, isCloseOther?: boolean ): FUIBase<any>/*** 打开UI界面* @param name 要打开界面的名字* @param isCloseOther 是否关闭其他界面 默认否*/OpenPanel(name: string, isCloseOther?: boolean): FUIBase<any>;/*** 关闭UI界面 * @param name 要关闭UI界面的名字* @param TOOpen 关闭此界面后要打开的界面的名字  默认无  不打开其他界面*/ClosePanel(name: string,toOpenWindow?:string): void;/*** 关闭所有UI界面*/CloseAllPanel(): void;/*** 根据标识符获取FUIBase* @param name 标识符*/GetUIPanel(name: string):any;/*** 销毁UIPanel* @param name 标识符*/DestoryUIPanel(name: string);}

UILayerType

/*** @ name:UILayerType* @ desc:UI 层级分类* @ user:By NUOLO* @ data: 2021-06-02 16:55*/export  enum UILayerType {//普通窗体Normal=0,//固定窗体Fixed=20,//弹出窗体PopUp = 50,//提示窗体Tip = 40,}

框架就分为这4个类 使用的话就每个UI界面都继承 FUIBase<具体fgui导出的UI类>
并重写 参数

如例子:

fgui 导出文件为  Package1.fuiPackage1Binder.tsUI_Component1.tsPackage1Binder.ts新建一个ShowUI 的脚本 继承与FUIBase <UI_Component1>

示例 ShowUI类

import { FUIBase } from "../Core/UI/FGUI/FUIBase";import { UILayerType } from "../Core/UI/FGUI/UILayerType";import Package1Binder from "./Package1/Package1Binder";import UI_Component1 from "./Package1/UI_Component1";/*** @ name:ShowUI* @ desc:UI的控制类 * @ user:By NUOLO* @ data: 2021-06-09 11:00*/export default class ShowUI extends FUIBase <UI_Component1>{public static ResName: string = "res/FGUI/Package1";    //路径public static AtliasCount: number = 0;                  //图集数量 从0开始public static UIName: string = "1";                     //名称constructor() {super();this.LayerType = UILayerType.Normal;                //设置层级this.ClassType = UI_Component1;                     //设置UI所对应的类,,确定好再填Package1Binder.bindAll();                           //UI绑定类}onAwake() {super.onAwake();}onEnable() {super.onEnable();}onDisable() {super.onDisable();}}

示例 调用方法

onConfigLoaded(): void {//加载IDE指定的场景//  GameConfig.startScene && Laya.Scene.open(GameConfig.startScene);this.openFGUI();}openFGUI() {let uimagr = new FGUIManager();          //初始化UI管理类//打开界面Laya.loader.create(ShowUI.GetLoadUIPackDic(), Laya.Handler.create(this, () => {uimagr.CreateOrOpenPanel(ShowUI.UIName, ShowUI);}));}

整个调用过程都很简单,代码逻辑也很明了,自己正在使用中
如果有更好的方法和更优雅的写法,也请通过邮件联系我,共同学习一下,多谢!

个人博客地址 https://nuolo.xyz

laya fgui 超简单的UI框架相关推荐

  1. 简单的UI框架 | 一、UI界面的搭建

    简单的UI框架 UI界面的搭建 文章目录 简单的UI框架 前言 一.UI资源的导入 二.游戏主界面设置 1.背景设置 2.游戏主玩法图标按钮 3.游戏主玩法界面 4.预制体 总结 前言 本文将会学习到 ...

  2. WPF - 简单的UI框架

    实现了一个简单的WPF应用程序UI框架 ,分享出来.界面效果图如下: 运行效果如下: 打算持续更新,将左侧面板所有功能模块全给实现了. 喜欢的可以下载源码体验:https://github.com/D ...

  3. 设计一个简单的UI框架,实现不同模块之间相互转换,使用单例实现。

    实现不同模块或窗口的互相切换,其实用一些代码都可以实现,但是使用UI框架不仅方便后续修改添加删除,同时在做出扩展效果时,也可以快速实现.由于我还是学生,这些搭建UI的材料都是以前玩的一些小游戏里面,比 ...

  4. 超简单利用xposed框架破解钉钉打卡

    最近长沙的天气已经降低到2°了,可想而知迟到也是家常便饭了. 所以就一直找办法可以远程打卡. 什么teamviewer. 大牛定位都不是特别好用要么要两台手机要么就是收费什么的. 不过前两天找到一个不 ...

  5. 超简单利用xposed框架破解钉钉打卡 1

    最近长沙的天气已经降低到2°了,可想而知迟到也是家常便饭了. 所以就一直找办法可以远程打卡. 什么teamviewer. 大牛定位都不是特别好用要么要两台手机要么就是收费什么的. 不过前两天找到一个不 ...

  6. ui动效 unity_简易 Unity3D UI 框架

    看见一篇介绍 Unity3D UI 框架编写的文章,并且给出了示例代码.然后去了解了一下.讲道理,示例代码蛮乱的,不知道有一些是不是直接从项目代码拷贝然后简单修改,对于一个简单的框架来说,有很多不必要 ...

  7. 2015最流行的Android组件、工具、框架大全 UI框架大全

    Android 是目前最流行的移动操作系统之一. 随着新版本的不断发布, Android的功能也日益强大, 涌现了很多流行的应用程序, 也催生了一大批的优秀的组件. 本文试图将目前流行的组件收集起来以 ...

  8. Vue CLI 3结合Lerna进行UI框架设计

    第一次在掘金发文章,有点啰里啰嗦,大家见谅. 当前大部分UI框架设计的Webpack配置都相对复杂,例如Element.Ant Design Vue和Muse-UI等Vue组件库.例如Element, ...

  9. Laya:基于Prefab的简单UI框架。

    UI框架的功能: 方便快捷的对UI界面进行管理:如快速打开与关闭一个界面,防止相同界面多开等等. 核心代码有2个脚本,一个UIMgr,一个UIBase. UIMgr的功能是管理UI界面. UIBase ...

  10. 【RuoYi框架】RuoYi框架学习超简单案例 - 新闻管理系统(附源码)

    文章目录 前言 一.需求 二.数据库设计 1.新闻菜单表(树表) 1.新闻内容表 三.运行RuoYi项目 1.创建数据库,运行sql文件 2.启动运行RuoYi项目 四.生成代码 1.添加字典(菜单显 ...

最新文章

  1. R语言file_path_sans_ext函数剔除文件后缀实战
  2. JAVA 的 Date、Calendar的常用用法
  3. java程序课程总结_java课程总结
  4. 45.Keepalived高可用群集
  5. Node.js 函数
  6. Spring MVC JSR-303验证框架之Hibernate-Validator
  7. GraphEmbedding - Node2vec 图文详解
  8. 冒泡排序及一个小小的优化
  9. 你是我的眼:水哥王昱珩带你重新打量这世界
  10. 六、T100固定资产之固定资产月结处理
  11. wincc7.0显示无法访问服务器,WinCC 7.0 SP3 安装时提示网络连接不可用,无法安装...
  12. 快手小店后台数据爬取(selenium+openpyxl)
  13. 小米air2se耳机只有一边有声音怎么办_小米耳机只有一边有声音,这问题怎么解决...
  14. 通读JavaScript红皮书(第二三章)
  15. 我是没有志气的程序员
  16. HTML虚拟键盘带声音特效
  17. Kettle--java代码组件实现密码加密(BCryptPasswordEncoder)
  18. 敬畏崛起,王自如的传奇人生
  19. Windows用户及组管理
  20. 安卓7.0之后ssl如何抓包是一个NP难题么?

热门文章

  1. python模拟账号登录_用Python(Tornado)模拟登录小米帐号
  2. c语言伪代码写for循环,伪代码撰写规范
  3. 老男孩Linux高薪运维23期完整版
  4. Drool规则引擎详解(一)
  5. BT种子文件 bencoding编码详细解析
  6. 三星530换固态硬盘_也许是目前性价比最高的固态硬盘!三星870 QVO快速体验
  7. 公开课丨苏杰新著来袭,十年之后再谈人人都是产品经理!
  8. SQL语句练习(全)
  9. python调用bing翻译API V2
  10. hadoop菜鸟教程 Hadoop学习资料(云计算学习电子书)