Unity 游戏框架搭建 2018 (一) 架构、框架与 QFramework 简介

约定

还记得上版本的第二十四篇的约定嘛?如今出来履行啦~html

为何要重制?

以前写的专栏都是按照心情写的,在最初的时候笔者什么都不懂,并且文章的发布是按照很随性的一个顺序。结果就是说,你们都看完了,都还对框架没有一个感受,感受很乱。而如今,通过两年多的摸索,笔者已经对框架的体系有了一个了解,因此但愿再版一次此系列的专栏。git

为何不在原来的文章里直接修改呢?

在上一轮的专栏第二十四篇里有讲过过:虽然之前的内容过期了,可是这些专栏对笔者有很重要的意义,它们记录了笔者成长的一个经历,在评论区有着你们的支持和鼓励也有一些颇有意义的问答,因此笔者舍不得破坏掉这些宝贵的回忆。github

更新哪些内容?

此次的重制更新的内容围绕以下几点:设计模式

  1. 在原有内容的基础上补充更多内容。
  2. 语句不通顺、不太容易理解、有歧义的地方、不够严谨的地方进行修改优化。
  3. 顺序调整:会按照从易到难、由浅入深、由经常使用到不经常使用这三个角度进行内容上的排版,以提升阅读体验,使只是掌握更容易更充分。
  4. QFramework 的介绍与原理,重点是 UI 和 资源管理两个模块的介绍与原理。

整理后的内容结构以下:微信

  • 理论与方法论:包含架构与框架搭建、重构、命名、测试、设计模式等内容。
  • 资源管理神器: ResKit (重点)
  • UI 框架: UIKit (重点)
  • QFramework 最佳实践与 Demo
  • 概括和总结。

但愿此次能够你们展示一个比较清晰的框架知识体系。架构

这次专栏重制的背景就写到这里。接下来开始正文。框架

架构与框架初识

什么是架构?

架构是一个约定,一个规则,一个你们都懂得遵照的共识。那这是什么样的约定、什么样的规则、什么样的共识呢?异步

我以包为例,我常常出差,双肩背包里装了很多东西。笔记本电脑、电源、2 个上网卡、鼠标、USB 线、一盒大的名片、一盒小的名片、口香糖、Mini-DisplayPort 转 VGA 接口、U 盘、几根笔、小螺丝刀、洗漱用品、干净衣服、袜子、香水、老婆给我带的抹脸膏(她嫌我最近累,脸有点黄)、钱包、Token 卡、耳机、纸巾、USB 线、U 盘等。这个包有不少格子,最外面的格子我放经常使用的,好比笔、纸、一盒小的名片等;中间的格子通常放的是衣服、袜子、洗漱用品、香水等;靠背的那个大格子放了笔记本电脑,和笔记本电脑相近的小格子放的是两个上网卡、Mini-DisplayPort 转 VGA 接口、大盒名片、记事本,和笔记本电脑相近的大格子放的是电源、鼠标、口香糖等。工具

我闭着眼睛均可以将个人东西从包里掏出来,闭着眼睛均可以将东西塞到包里!可是,很是不幸的是,一旦我老婆整理过个人包,那我就很惨了,总是由于找不到东西而变得抓狂!更不幸的,要是我那个不到两岁的“小可爱”翻过,就更不得了了。学习

这个包就是我放全部物品的“架构”,每个东西放置的位置就是个人“约定、规则、共识”。假若我老婆也知道个人“架构”、个人“约定、规则、共识”,那么无论她怎么动个人包,我都照样可以轻易的拿东西或者放东西。进一步,若是个人同事也知道个人“架构”,知道个人“约定、规则、共识”,那么他们何时动个人包,我也毫无所知!——道法天然 《10 年感触:架构是什么?——消灭架构!》

什么是框架?

框架(framework)是一个框子--指其约束性,也是一个架子--指其支撑性。——360 百科

小结

本小节对框架和架构概念作了简单的认识,得出了如下两个结论:

  • 架构是“约定、规则、共识”
  • 框架具备约束性和支撑性

到这里,你们应该对这两个概念有点感受了。可是仍是会有不少疑问,好比“如何去作架构?”、“框架的约束性和支撑性分别指的什么怎么体现的?”等等。这些在后续的专栏中详细讲解。关于架构与框架的初识就介绍到这里。

QFramework 简介

两年前,笔者毕业半年,刚从 cocos2d 转 Unity 不到两个月,当时所在的公司有一套游戏开发框架。笔者用它作了两个月的项目,使用框架作项目的时候并无去思考框架是什么,只是开始的时候以为很新鲜,并且越用越顺手,尝到了它的甜头。

后来笔者接到了一个跑酷游戏项目,因而就把工做辞掉了,决定出来全职作这个项目。辞职后,公司的框架因为保密协议就不能够用了。项目就只能从零开始开发,那么结果就是在跑酷项目的开发的过程当中各类中水土不服。

因而,笔者就开始了市面上开源框架的选型,折腾了几天,发现要么上手太难,要么学习成本很高文档不齐全,有的框架光是理解概念就要好久,对于像笔者同样刚毕业的初学者来讲,市面上的开源框架真的很不友好。

从那时候笔者就决定要 为本身,开发一套符合本身使用习惯的框架,也就是如今的 QFramework。

为何叫 QFramework

笔者在作 cocos2dx 的时候,市面上有个叫 Quick-Cocos2d-x 的开源框架,用两个词形容就是简单、强大。

而笔者一直坚信好的工具就应该简单。

QFramework 的目标是要作到像 Quick-Cocos2d-x 同样 “简单、强大”。当时笔者纠结过不少名字,好比 QuickEngine,QuickUnity 等等。Q 表明 Quick,而且 Q 这个字母给人感受灵活有弹性,因此最终肯定为 QFramework。

QFramework 的目标

记得在此系列上一轮的第十篇中有以下一段话:

笔者意愿是想把 QFramework 打形成,让使用的人以为全部框架中出现的概念要很是清晰,没有任何模糊的概念,出现的概念已经达成共识的概念,没有任何生僻概念,使用门槛尽很低:)。

这个 flag 是 2016 年立的,目前从用户的反馈来看完成得还不错。

QFramework 群里有人形容 QFramework 三个词:简单、粗暴、还有点小精致,笔者以为形容地很是地贴切。

目前主要三个模块,UIKit,ResKit,ActionKit。目前还有一个模块 EditorKit 正在开发中。

看到这里你们可能对 ActionKit 有些陌生,它的前身就是 QChain,负责全部的异步逻辑,包含 UniRx 和 Promise 还有一套轻量级的行为树。以后会用一个很是详细的文章介绍它。

QFramework 快速入门:

要介绍 QFramework 只要附上三段代码就够了:

1.Action Kit

  • chainning style(Driven by MonoBehaviour or Update)
this.Sequence()
    .Delay(1.0f)
    .Event(()=>Log.I("Delayed 1 second"))
    .Until(()=>something is done)
    .Begin();
  • object oriented style
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.Res Kit

// 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.UI Kit

// 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.EmptyGO:

  在 Hierarchy 上建立一个空的 GameObject,而后挂上全部与 GameObject 无关的逻辑控制的脚本。使用GameObject.Find() 访问对象数据。

缺点:逻辑代码散落在各处,不适合大型项目。

2.Simple GameManager:

  全部与 GameObject 无关的逻辑都放在一个单例中。
缺点:单一文件过于庞大。

3.Manager Of Managers:

将不一样的功能单独管理。以下:

  • MainManager: 做为入口管理器。
  • EventManager: 消息管理。
  • GUIManager: 图形视图管理。
  • AudioManager: 音效管理。
  • PoolManager: GameObject管理(减小动态开辟内存消耗,减小GC)。
  • LevelManager: 关卡管理。
  • GameManager: 游戏管理。
  • SaveManager: 配置&存储管理。
  • MenuManager 菜单管理。

4.将 View 和 Model 之间增长一个媒介层。

MVCS:StrangeIOC 插件。

MVVM:uFrame 插件。

5. ECS (Entity Component Based System)

Unity 是基于 ECS,比较适合 GamePlay 模块使用。
还有比较有名的 Entitas-CSharp

相关连接:

个人框架地址:https://github.com/liangxiegame/QFramework

教程源码:https://github.com/liangxiegame/QFramework/tree/master/Assets/HowToWriteUnityGameFramework/

QFramework&游戏框架搭建QQ交流群: 623597263

转载请注明地址:凉鞋的笔记http://liangxiegame.com/

微信公众号:liangxiegame

若是有帮助到您:

若是以为本篇教程或者 QFramework 对您有帮助,不妨经过如下方式赞助笔者一下,鼓励笔者继续写出更多高质量的教程,也让更多的力量加入 QFramework 。

笔者在这里保证 QFramework、入门教程、文档和此框架搭建系列的专栏永远免费开源。以上捐助产品的内容对于使用 QFramework 的使用来说都不是必须的,因此你们不用担忧,各位使用 QFramework 或者 阅读此专栏 已是对笔者团队最大的支持了。

相关文章
相关标签/搜索