笔者之前沉迷游戏无法自拔,但是现在之前玩的游戏也不太爱玩了,发现下班到睡觉之前有2-3个小时空闲,仿佛发现了一笔宝贵的财富不能浪费。
笔者从事手游工作也有两年的时间了,主要做的是逻辑和SDK方面的工作,有时候也查查平台相关的闪退卡死问题。从来没有系统的总结归纳过学过的知识,于是决定自己写个框架试试,也可以查漏补缺,不懂得地方就多看看别的怎么处理的。所以开贴记录下自己的学习成果,框架还不完善只是作为记录(可能并不能投入使用),老司机可以随意指点,我会虚心接受的。

一、UI插件的选择

笔者第一个项目用的插件是NGUI,因为当时没得选,市场上就有这一款插件供使用。自从Unity推出了自己的UGUI,大部分新的项目也相继使用开来。我猜想主要原因是UGUI是Unity原生的,所以效率性能应该会好很多,兼容性也会提高。笔者两款UI插件都有用过,但是从去年开始就关注Unity的第三款UI插件FairyGUI,发现此款插件有很多方便开发者的功能,加之笔者自己的实验项目那就研究个没尝试过得好了,所以就选择了FairyGUI。
FairyGUI地址:http://www.fairygui.com/
第一件事就是上官网下demo,看官网的视频、帖子,加官方群询问一些不了解的地方。笔者这里建议在问问题之前最好把自己能查到的能看到的东西都看完,这样也是出于对作者的尊重,也不会让自己遭人嫌弃。

二、语言的选择

说个好玩的事情,笔者想写自己的项目不是一天两天了,之前也放弃过一次,那时候觉得一个项目必须做好热更新,有bug就要及时修复,还能更新出一些新玩法。但是笔者服务器的造诣尚浅,那时候没有找到如果做到lua协议热更新,如果协议不能热更新那么能更新的新功能的太少,在寻找探索的过程中也就放弃了。
当然笔者现在还是不太会服务器,罗马不是一天建成的所以此次先用c#写项目,但是我会减少对c#的依赖,等哪天搞定的服务器,就将框架移植到lua中

三、UI插件的使用

FGUI在Unity方面的使用主要关注的是“包”也就是Package。你如果想显示一个UI界面,首先需要找到UI界面所引用的包,将这些包加载进来(UIPackage.AddPackage),你才能看到UI的界面(UIPackage.CreateObject)。
所以UI框架的第一个任务是需要管理Package的加载与卸载,还有Component的显示。
那么第一份代码就是管理包

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using FairyGUI;public class UIPackageManager : BaseManager<UIPackageManager>
{//记录包是否Add的字典private Dictionary<string, bool> packageAddDict = new Dictionary<string, bool>();/// <summary>/// 将一个UI包add进来/// </summary>/// <param name="packageName">UI包名</param>public void AddPackage(string packageName){if (CheckPackageHaveAdd(packageName) == false){UIPackage.AddPackage("UI/"+packageName);}}/// <summary>/// 检查UI包是否已经包进来/// </summary>/// <param name="packageName">UI包名</param>public bool CheckPackageHaveAdd(string packageName){return packageAddDict.ContainsKey(packageName);}/// <summary>/// 清理没有用到的UI包/// </summary>public void ClearNotUsePackage(){//*****************************}
}

通过一个字典来记录UI的包是否已经加载进来,笔者在想何时卸载,由于是第一款小游戏暂时先不做的那么详细(我懒),如果UI资源比较少,完全可以不卸载。也可以等applicationDidReceiveMemoryWarning过来卸载没有用到的资源,这就涉及UI界面与包的引用关系了,等我想明白再开一贴记录。
下面第二份代码是界面的管理

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using FairyGUI;public class DialogManager : BaseManager<DialogManager>
{Dictionary<DialogType, BaseDialog> dialogDict = new Dictionary<DialogType, BaseDialog>();/// <summary>/// 打开界面/// </summary>public void OpenDialog(DialogType dialogType){DialogInfo dialogInfo = DialogConfigManager.GetInstance().GetDialogInfo(dialogType);UIPackageManager.GetInstance().AddPackage(dialogInfo.GetPackName());GComponent view = UIPackage.CreateObject(dialogInfo.GetPackName(), dialogInfo.GetDialogName()) as GComponent;view.SetSize(GRoot.inst.width, GRoot.inst.height);GRoot.inst.AddChild(view);dialogDict[dialogType] = DialogConfigManager.GetInstance().GetDialogControl(dialogType);dialogDict[dialogType].SetDialogView(view);dialogDict[dialogType].OnBeforeCreate();dialogDict[dialogType].AddListener();dialogDict[dialogType].OnCreate();dialogDict[dialogType].OnRefresh();}/// <summary>/// 关闭界面/// </summary>public void CloseDialog(DialogType dialogType){if (dialogDict.ContainsKey(dialogType)){dialogDict[dialogType].RemoveListener();dialogDict[dialogType].OnHide();dialogDict[dialogType].OnDestory();dialogDict[dialogType].GetView().Dispose();dialogDict.Remove(dialogType);}}}

打开界面判断包是否加载,如果没有则加载包再打开界面
第三份代码是UI配置的管理

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using FairyGUI;public class DialogConfigManager : BaseManager<DialogConfigManager>
{public Dictionary<DialogType, DialogInfo> dialogDict;public DialogConfigManager(){InitDialogConfig();}public void InitDialogConfig(){dialogDict = new Dictionary<DialogType, DialogInfo>();dialogDict[DialogType.Main] = new DialogInfo("MainUI", "Win_Main");dialogDict[DialogType.Farm] = new DialogInfo("FarmUI", "Win_Farm");}public DialogInfo GetDialogInfo(DialogType dialogType){return dialogDict[dialogType];}public BaseDialog GetDialogControl(DialogType dialogType){switch (dialogType){case DialogType.Main:return new MainUIDialog();case DialogType.Farm:return new FramUIDialog();default:return null;}}
}public class DialogInfo {private string _packName;private string _dialogName;public DialogInfo(string packName, string dialogName){_packName = packName;_dialogName = dialogName;}public string GetPackName(){return _packName;}public string GetDialogName(){return _dialogName;}}

笔者的UI框架没有采用AddComponent挂脚本的方法,因为如果过度使用,未来很难移植到lua中。
界面配置管理通过GetDialogControl拿到每一个界面对应的累,并将Component Set到类中,方便之后Find组件和控制。

using UnityEngine;
using System.Collections;
using FairyGUI;public class BaseDialog {private GComponent _view;private DialogType _dialogType;public BaseDialog(){}public void SetDialogView(GComponent view){_view = view;}public void SetDialogType(DialogType dialogType){_dialogType = dialogType;}public GComponent GetView(){return _view;}/// <summary>/// 创建前期 主要用于寻找view上的组件/// </summary>public virtual void OnBeforeCreate(){}/// <summary>/// 添加监听事件/// </summary>public virtual void AddListener(){}/// <summary>/// 删除添加事件/// </summary>public virtual void RemoveListener(){}/// <summary>/// 创建成功 主要用于逻辑注册/// </summary>public virtual void OnCreate(){}/// <summary>/// 用于缓存界面后的第二次以上打开/// </summary>public virtual void OnRefresh(){}/// <summary>/// 界面隐藏/// </summary>public virtual void OnHide(){}/// <summary>/// 界面销毁/// </summary>public virtual void OnDestory(){}public void Update(){}
}

本帖只作为学习记录,只为提供一个思路,还有很多坑要去填,比如AB模式的异步加载包,包的删除管理等。

【Unity自己写框架】FairyGUI UI框架(一)相关推荐

  1. 黄聪:Android酷炫实用的开源框架(UI框架)(转)

    Android酷炫实用的开源框架(UI框架) 前言 忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮 ...

  2. ym——Android酷炫实用的开源框架(UI框架)(终)

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! 前言 好久没写博文了,最近工作比较忙,剩下的一点点时间在做自己的项目,在Android ...

  3. android 动画开源框架,图文简介非常炫酷的Android开源框架之UI框架

    架构,其又名软件架构,是关于软件整体结构与组件的抽象描述,用于指导大型软件系统各个方面的设计.而软件架构(software architecture)是一系列相关的抽象模式,其是用来指导大型软件系统各 ...

  4. rf框架搭建_RF框架—自动化UI框架解决方案模版

    RF框架-自动化UI框架解决方案模版 第一章 项目特色 基于WEBUI自动化项目企业实战经验总结搭建的属于自己的一套自动化开发脚手架. 技术框架选用Robot Framework用于验收测试和验收测试 ...

  5. vue框架是ui框架么_Vue是2020年一个了不起的框架,为什么

    vue框架是ui框架么 An amazing conference regarding the Vue framework was held in the US in the first week o ...

  6. Unity进阶第四章-UI框架

    一.消息框架概述 二.UI框架实现 (1)导入之前的框架,并创建3个新的脚本:UIManager.UIControl.UIController. UIManager using System.Coll ...

  7. android 最新开源框架,Android酷炫实用的开源框架(UI框架)

    前言 忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮助,此博文介绍的都是UI上面的框架,接下来会有 ...

  8. Android酷炫实用的开源框架(UI框架)

    前言 忙碌的工作终于可以停息一段时间了,最近突然有一个想法,就是自己写一个app,所以找了一些合适开源控件,这样更加省时,再此分享给大家,希望能对大家有帮助,此博文介绍的都是UI上面的框架,接下来会有 ...

  9. 前端工具集合(js框架、ui框架、开发工具...)

    vue3 vue3官网:Vue.js pc端开发ui框架(element-plus):一个 Vue 3 UI 框架 | Element Plus 移动端ui框架(vant):Vant - Mobile ...

最新文章

  1. 四连问:API 接口应该如何设计?如何保证安全?如何签名?如何防重?
  2. webp-imageio 如何编译及使用
  3. react.js 引用 NavBar 报错svg-spite-loader
  4. docker-machine
  5. Android笔记 theme主题
  6. 忍不住跟着吐槽 —“当你辛辛苦苦写的博客文章被无情复制,成为了他的原创,你作何感想?”...
  7. php发布post到wordpress,PHP-如何将数据发布到wordpress插件?
  8. Myeclipse学习总结(4)——Eclipse常用开发插件
  9. oracle 批量更新_用集算器更新数据库的技巧
  10. hdu3729(二分图)
  11. Linux stat命令和AIX istat命令 (查看文件修改时间)
  12. loadrunner:关联操作
  13. php error_log记录日志的使用方法和配置
  14. wamp 局域网访问
  15. storm风暴英雄 tempo_风暴英雄Tempo Storm 安娜版本天梯环境速报 安娜强度居T3
  16. [转贴]杨式太极拳八十五式通释—1—王志远
  17. RAKsmart服务器优势有哪些?外贸选择的关键原因
  18. 谈谈你对web语义化的理解
  19. 春节购机如何选?老司机会告诉你买华为Mate 20 Pro
  20. PyCharm中的iCCP: known incorrect sRGB profile报错问题

热门文章

  1. python爬虫完整代码下载页
  2. 3D数学系列之——从“蒙的挺准”到“蒙的真准”解密蒙特卡洛积分!
  3. 算法工程师(机器学习/深度学习)Offer的准备流程
  4. 2021超全大数据面试宝典,吐血总结十万字,大数据面试收藏这一篇就够了
  5. java基础之转换流
  6. 计算机图形学 使用OpenGL的场景建模
  7. python基础“猜单词游戏”代码
  8. Pytorch - Illegal instruction
  9. 7-5 重要的话说三遍 (5 分)
  10. 忙里偷闲 -- 入职感悟