还记得上一版本第24章的约定吗? 现在就出来兑现吧~
为什么要重拍?
我之前写的专栏都是根据自己的心情写的。 一开始,作者什么都不懂,文章发表的顺序也很随意。 结果就是大家读完之后,对框架还是没有概念,感觉很混乱。 现在,经过两年多的探索,作者对框架体系有了一定的了解,所以希望再次发布这个系列专栏。
为什么不直接在原来的文章中修改呢?
正如上轮第二十四专栏中提到的:虽然之前的内容已经过时,但是这些专栏对作者来说意义重大。 他们记录了作者成长的一段经历贴图笔刷,大家的评论都在评论区分享。 还有一些有意义的问答支持和鼓励游戏开发框架,所以我不忍心破坏这些珍贵的回忆。
更新了哪些内容?
本次重制版更新内容重点关注以下几点:
在原有内容的基础上添加更多内容。 对不流畅、难以理解、含糊不清、不够严谨的表述进行修改和优化。 顺序调整:内容将从由易到难、由浅入深、由常用到不常用三个角度进行排版,以提升阅读体验,让其更容易、更完整地掌握。 QFramework的介绍和原理,重点是UI和资源管理模块的介绍和原理。
组织的内容结构如下:
希望这次能给大家展示一个更清晰的框架知识体系。
这就是本专栏翻拍的背景。 接下来开始正文。
架构与框架 首先了解什么是架构?
建筑是一种惯例、一种规则、一种共识,每个人都知道要遵守。 那么这是什么样的协议、什么样的规则、什么样的共识呢?
让我以袋子为例。 我经常旅行,背包里装了很多东西。 笔记本电脑、电源、2张网卡、鼠标、USB线、一盒大名片、一盒小名片、口香糖、Mini-DisplayPort转VGA接口、U盘、几支笔、小螺丝刀、洗漱用品,干净的衣服游戏开发框架,袜子,香水,老婆给我带来的洗面奶(她觉得我最近很累,脸有点黄),钱包,令牌卡,耳机,纸巾,USB线2d素材,U盘等等。包有很多隔层。 我把常用的物品放在外层隔层里,比如笔、纸、一盒小名片等; 中间隔层通常装有衣服、袜子、洗漱用品、香水等; 背面的大隔层可放置笔记本电脑。 类似于笔记本电脑的小格子里有两张网卡、Mini-DisplayPort转VGA接口、一大盒名片、一个记事本。 类似于笔记本电脑的大网格,里面有电源、鼠标、口香糖等。
我可以闭着眼睛把东西从包里拿出来,我也可以闭着眼睛把东西放进包里! 但不幸的是,一旦我的妻子整理我的包,我就痛苦不堪,发疯了,因为我什么也找不到! 如果我那还不到两岁的“小可爱”翻车了那就更不幸了。
这个包就是我放置所有物品的“结构”,每件物品的位置就是我的“协议、规则和共识”。 如果我的妻子也知道我的“结构”,我的“协议、规则、共识”,那么无论她怎么搬我的包,我仍然可以轻松地拿或放东西。 而且,如果我的同事也知道我的“结构”和我的“协议、规则、共识”,那么我根本不知道他们什么时候碰我的包裹! ——陶发自然《十年反思:什么是结构?》 ——破坏结构! 》
什么是框架?
框架是一个框架——指的是它的限制性,而一个架子——指的是它的支撑性。 ——360百科
概括
本节简单了解框架和架构的概念,得出以下两个结论:
说到这里,大家应该对这两个概念有了感受了。 但仍然存在很多问题,比如“如何构建一个结构?”、“框架的约束和支撑是什么以及如何体现?” 等等。 这些将在后续专栏中详细解释。 这是对架构和框架的第一次介绍。
QFramework简介
两年前,也就是毕业半年后,我刚从cocos2d转到Unity不到两个月。 我当时工作的公司有一个游戏开发框架。 作者用它在一个项目上工作了两个月。 当我用框架做项目的时候,我并没有思考框架是什么。 我一开始只是觉得很新鲜,而且越用越舒服,尝到了它的甜头。
后来,笔者接到了一个跑酷游戏项目,于是辞掉了工作,决定全职做这个项目。 辞职后,公司框架因保密协议而无法使用。 项目只能从头开始开发,结果就是跑酷项目开发过程中各种水土不服。
于是,笔者开始挑选市面上的开源框架。 纠结了几天,发现要么上手太难,要么学习成本高,文档不全。 有些框架需要很长时间才能理解这些概念。 对于我这样的新手,对于应届毕业生来说,市面上的开源框架确实不太友好。
当时笔者决定为自己开发一个适合自己使用习惯的框架,就是现在的QFramework。
为什么叫QFramework?
笔者在做cocos2dx的时候,市面上有一个开源框架叫Quick-Cocos2d-x,可以用简单、强大两个字来形容。
作者一直认为好的工具应该是简单的。
QFramework 的目标是像 Quick-Cocos2d-x 一样“简单而强大”。 当时作者纠结了很多名字,比如QuickEngine、QuickUnity等等,Q代表Quick,字母Q给人的感觉很灵活、灵活,所以最终决定是QFramework。
Q框架目标
我记得本系列上一轮第十篇文章中有这样一段话:
作者的意图是构建QFramework,让用户感觉框架中出现的所有概念都必须非常清晰,没有任何模糊的概念,已经达成共识的概念,没有任何陌生的概念,使用门槛尽可能低:)。
这个flag是2016年设立的,从用户反馈来看,已经完成得相当不错了。
QFramework组里有人用三个词形容QFramework:简单、粗犷、精致一点。 我认为这个描述非常恰当。
目前主要有三个模块,UIKit、ResKit、ActionKit。 目前还有一个模块 EditorKit 正在开发中。
说到这里,你可能对 ActionKit 还有些陌生。 它的前身是QChain,负责所有异步逻辑,包括UniRx和Promise,以及一组轻量级行为树。 稍后会在一篇非常详细的文章中介绍。
QFramework快速入门:
要引入QFramework,附上三段代码就够了:
1.动作套件
this.Sequence()
.Delay(1.0f)
.Event(()=>Log.I("Delayed 1 second"))
.Until(()=>something is done)
.Begin();
var sequenceNode = new SequenceNode();
sequenceNode.Append(DelayAction.Allocate(1.0f));
sequenceNode.Append(EventAction.Allocate(()=>Log.I("Delayed 1 second"));
sequenceNode.Append(UntilAction.Allocate(()=>something is true));
this.ExecuteNode(sequenceNode);
2.资源套件
// allocate a loader when initialize a panel or a monobehavour
var loader = ResLoader.Allocate<ResLoader>();
// load someth in a panel or a monobehaviour
loader.LoadSync<GameObject>("Resources/smobj");
loader.LoadSync<Texture2D>("Resources/Bg");
// load by asset bundle's assetName
loader.LoadSync<Texture2D>("HomeBg");
// load by asset bundle name and assetName
loader.LoadSync<Texture2D>("home","HomeBg");
// resycle this panel/monobehaivour's loaded res when destroyed
loader.Recycle2Cache()
loader = null
3.用户界面套件
// open a panel from assetBundle
UIMgr.OpenPanel<UIMainPanel>();
// load a panel from specified Resources
UIMgr.OpenPanel<UIMainPanel>(prefabName:"Resources/UIMainPanel");
// load a panel from specield assetName
UIMgr.OpenPanel<UIMainPanel>(prefabName:"UIMainPanel1");
这里介绍一下QFramework。
Unity中常用的架构,儿童节礼物
今天是儿童节。 作为礼物,我想送给你一段对我影响最大的一段话:
写项目的时候,不要目光短浅,说我会完成项目。 我只需要支付费用并上网即可。 我们希望我们每次写游戏的时候,都能积累一些东西,把我们写的每一行代码都当作一种可以收藏甚至传承的资产。 有了这样的想法,也许我们在写代码的时候,整个思维模式就会完全不一样了。 ——刘刚《Unity项目架构与开发管理》
上面这段话来自于刘刚老师的讲座《Unity项目架构设计与开发管理》的结尾。
Unity项目架构设计与开发管理
笔者在学习Unity不久后有幸看到了刘刚老师的这段视频。 笔者当时深受启发。 视频中提出的 Manager Of Managers 很好地为 QFramework 指明了方向。 视频简单易懂,里面很多内容值得反复咀嚼。 我花了很长时间才消化掉里面的内容。 直到今天,再次观看这个视频,我仍然收获颇多。 希望大家看完后有所收获、有所启发。
视频中最精彩的部分是从一个没有架构的项目逐渐演变到MVVM和StrangeIOC架构。
关于Unity的架构,常用的有几种方法,简单总结如下:
1.清空GO:
在Hierarchy上创建一个空的GameObject,然后附加所有与GameObject无关的逻辑控制脚本。 使用 GameObject.Find() 访问对象数据。
缺点:逻辑代码分散各处,不适合大型项目。
2.简单的游戏管理器:
所有与 GameObject 无关的逻辑都放在单例中。
缺点:单个文件太大。
3.经理中的经理:
分别管理不同的功能。 如下:
4. 在视图和模型之间添加媒体层。
MVCS:奇怪的IOC插件。
MVVM:uFrame 插件。
5.ECS(基于实体组件的系统)
Unity基于ECS,更适合与GamePlay模块一起使用。
还有比较出名的Entitas-CSharp
相关链接:
转载请注明地址:凉鞋笔记:
更具体的内容权利、教学形式等详情请查看《小班产品手册》:
文章来源:https://blog.csdn.net/yukikit/article/details/104746513