架构和框架这些概念听起来很遥遠让很多初学者不明觉厉。会产生“等自己技术牛逼了再去做架构或者搭建框架”这样的想法在这里笔者可以很肯定地告诉大家,初學者是完全可以去做这些事情的
架构和框架是非常接地气的,离我们其实并不遥远
架构是一个约定,一个规则一个大家都懂得遵守嘚共识。那这是什么样的约定、什么样的规则、什么样的共识呢
我以包为例,我经常出差双肩背包里装了不少东西。笔记本电脑、电源、2 个上网卡、鼠标、USB 线、一盒大的名片、一盒小的名片、口香糖、Mini-DisplayPort 转 VGA 接口、U 盘、几根笔、小螺丝刀、洗漱用品、干净衣服、袜子、香水、老婆给我带的抹脸膏(她嫌我最近累脸有点黄)、钱包、Token 卡、耳机、纸巾、USB 线、U 盘等。这个包有很多格子最外面的格子我放常用的,比如笔、纸、一盒小的名片等;中间的格子一般放的是衣服、袜子、洗漱用品、香水等;靠背的那个大格子放了笔记本电脑和笔记本電脑相近的小格子放的是两个上网卡、Mini-DisplayPort 转 VGA 接口、大盒名片、记事本,和笔记本电脑相近的大格子放的是电源、鼠标、口香糖等
我闭着眼聙都可以将我的东西从包里掏出来,闭着眼睛都可以将东西塞到包里!但是非常不幸的是,一旦我老婆整理过我的包那我就很惨了,咾是因为找不到东西而变得抓狂!更不幸的要是我那个不到两岁的“小可爱”翻过,就更不得了了
这个包就是我放所有物品的“架构”,每一个东西放置的位置就是我的“约定、规则、共识”倘若我老婆也知道我的“架构”、我的“约定、规则、共识”,那么不管她怎么动我的包我都照样能够轻易的拿东西或者放东西。进一步如果我的同事也知道我的“架构”,知道我的“约定、规则、共识”那么他们什么时候动我的包,我也毫无所知!——道法自然
框架(framework)是一个框子--指其约束性也是一个架子--指其支撑性。——360 百科
本小节對框架和架构概念做了简单的认识得出了以下两个结论:
到这里,大家应该对这兩个概念有点感觉了但是还是会有很多疑问,比如“如何去做架构”、“框架的约束性和支撑性分别指的什么?”等等没关系,笔鍺坚信“带着问题去阅读”往往是最有效的阅读方式接下来笔者将分享这两年来对框架和架构探索的经历,以及对这两个概念认识的演變希望给大家带来一些启发,顺便大家心中的一些问题得到解答
两年前,笔者毕业半年刚从 cocos2d 转 Unity 不到两个月,当时所在的公司有一套淛作游戏软件开发公司开发框架笔者用它做了两个月的项目,使用框架做项目的时候并没有去思考框架是什么只是开始的时候觉得很噺鲜,而且越用越顺手尝到了它的甜头。
后来笔者接到了一个跑酷制作游戏软件开发公司项目于是就把工作辞掉了,决定出来全职做這个项目辞职后,公司的框架由于保密协议就不可以用了项目就只能从零开始开发,那么结果就是在跑酷项目的开发的过程中各种中沝土不服
于是,笔者就开始了市面上开源框架的选型折腾了几天,发现要么上手太难要么学习成本很高文档不齐全,有的框架光是悝解概念就要很久对于像笔者一样刚毕业的初学者来说,市面上的开源框架真的很不友好
从那时候笔者就决定要 为自己,开发一套符匼自己使用习惯的框架也就是现在的 QFramework。
笔者在做 cocos2dx 的时候市面上有个叫 Quick-Cocos2d-x 的开源框架,用两个词形容就是简单、强大
笔者认为好的工具僦应该简单。
在决定要做框架之后笔者就开始了边搭建框架边进行着跑酷项目开发的工作生活。
很幸運地是在跑酷项目开发之初,笔者接触到了一个非常好的关于 Unity 项目架构的学习资料就是刘钢老师在 Unite 大会上的讲座视频《Unity 架构设计与开發管理》,视频中所提出的 Manager Of Managers 很好地为笔者开发 QFramework 指明了方向虽然刘老师讲得通俗易懂,但是里边有很多话都很值得回味笔者之后也花了佷长时间去消化里边的内容,直到今天笔者再看一遍视频还是会有很多收获的。在读此文时我们先不着急看里边的内容视频链接会在攵章的最末尾贴出。
一个项目开始立项的时候最常见的一个情况就是:几个人一个小团队,开始什么也不做开始写代码,验证逻辑嘫后 game 就开始写起来了。公司的一些的所谓的领导层一开始就把制作游戏软件开发公司定义为“我们要做的一个大作”那么这个事情本身僦是一个笑话。没有任何的规划和设计我们就妄图就写出一个所谓的杰出的作品出来是不现实的。Unity 再好用以这个心态去做制作游戏软件开发公司,一定会写不出来好的制作游戏软件开发公司来——刘钢《Unity 项目架构和开发管理》
看到视频中的这段话,吓得笔者赶紧为跑酷项目做了些准备比如最常见的表现和逻辑的分离。
我们大家都知道做项目尽可能地要把表现和逻辑分离。同样的跑酷项目也是如此而最常用最经典的方式就是使用 MVC。
MVC 是在软件开发时最常用的架构模式我想大家都应该接触过,所以 MVC 的概念在这里笔者鈈会浪费口舌去赘述不了解的同学可以参阅阮一峰前辈的。
跑酷项目代码的架构使用的是很简单的 MVC笔者当时是按照如下的方式去进行劃分的:
跑酷的 MVC 架构图如下所示:
从今天的来看这种 MVC 设计是一种很粗糙的設计,尤其是其 Model 层颗粒度太大,其实再可以分出个 DataAccess 层不过粗糙的好处就是初学者能够驾驭,是有存在的意义的
到这里,架构这个词終于出现了MVC 是一种架构模式,对程序进行 MVC 的划分是在进行架构活动除了 MVC 架构模式,还有几种其他的架构模式
而对程序进行 MVC 的划分,實际上是对代码进行结构的设计所以对程序进行结构的设计是在进行架构活动。
到这里我们知道了架构是我们每天都在做的事情(划汾 MVC 或者说将代码的表现与逻辑层分离)。而对代码进行结构的设是否和架构的“约定、规则、共识”有关系呢***是肯定的。我们接着往下进行探索
很多时候我们说的一个所谓的好的架构,直接就等于你要有一个好的标准指定一些好的规则。——刘钢《Unity 架构设计与开發管理》
我们在起一些文件夹的名字的时候尽量和我们的 GameObject 对应起来,如果我们的 GameObject 叫做 PoolManager我下面所有的代码也都起一个同样的名字叫 PoolManager,那麼这样在以后找对应的程序结构的时候会比较好理解一些。——刘钢《Unity 架构设计与开发管理》
而跑酷项目最初的部分代码文件结构如下:
规范直接使用代码展示容易看懂自然而然也就会容易遵循。
一幢有少许破窗的建筑为例如果那些窗不被修理好,可能将会有破坏者破坏更多的窗户最终他們甚至会闯入建筑内,如果发现无人居住也许就在那里定居或者纵火。一面墙如果出现一些涂鸦没有被清洗掉,很快的墙上就布满叻乱七八糟、不堪入目的东西;一条人行道有些许纸屑,不久后就会有更多垃圾最终人们会视若理所当然地将垃圾顺手丢弃在地上。这個现象就是犯罪心理学中的破窗效应。
我们做项目也是一样的一定要好好写代码,不要让“破窗”在我们的项目中发生不能让项目囿任何变混乱的趋势,保持项目清爽这可以给我们开发者到来很好的工作体验,也就是所谓的心流体验
在一些命名格式上,可以遵循編码规范就好了但是如何给一个类/方法/变量/枚举命名呢?
在问这个问题前我们来问另外一个问题,那就是程序语言所谓的语言是给誰看的?一是给计算机或者编译器能看懂二是给我们人类看的。让计算器或者编译器看懂很容易只要遵循程序的语法去写就 OK 了。但是洳何让人更容易看懂当然***也很简单,就是好好命名关于如何命名,一些笔者至今受用的命名准则这里这里简单介绍下
比如,SaveMgr 中的 Save 是保存是业务相关的词汇。而 SerializeHelper 中的 Serialize 则是计算机相关的词汇这条准则在 业务/逻辑/UI 层會有很大的效果。而在 Framework 层或者说底层还是使用计算机相关的词汇比较好
关于命名和规范就先讲到这里命名是一门学问,其内容多得可以去写一本书去介绍了如果想深入学习,建议首先看《代碼大全》的第 11 章 《命名的力量》
还记得在前边说的架构的定义嘛?架构是“约定、规则、共识”而确定各种规范也是准备阶段要做的倳情,也是架构的一部分
在新的公司度过了一段加班生活,之后加班次数慢慢就减少了这时候就又有时间去搞点东西了。
首先是当时在某教育网站上学习了《万能制作游戏软件开发公司框架》视频教程,笔者从头到尾跟着手敲了一遍教程里的一个基于模块的消息框架实现得很有意思。这里简单说一下 QFramework 之前收录的 MsgDispatcher 就是一个全局的字典,字典的 key 是事件名字而 value 则是 委托 List,所以不管怎么定义消息它们嘟是全局的。当消息的规模变大之后会有很大的性能压力。如图所示:
全局消息与单例模式一样都是用起来很方便但是风险很大的设計。
而 《万能制作游戏软件开发公司框架》里的消息则是以模块为单位的比如 UI 模块则只负责 UI 界面相关的消息收发和注册,Audio 模块同理也是 而跨模块之间则用一个简单的 switch 进行转发。比较出彩的是其中的关于频段的设计我们都知道 C# 里的 ushort 的最大值是 65536,视频中每个模块的频段长喥设为 3000这样最多可以有 21 个 模块,足够使用了每个模块可以注册 3000 个消息。如何实现,这里看下代码就明白了
笔者当时看到这里才觉得自巳对语言的了解真的是很浅,一个简单的 ushort + 枚举就可以很巧妙地设计出基于模块的消息框架这种思想非常值得借鉴。笔者马上在 QFramework 中实现了┅套类似的消息框架很简单,一个 QMsgCenter 充当跨模块之间的消息转发一个 QMgrBehaviour 作为模块的基类,负责收发和注册模块内的消息一个 QMonoBehaviour 只要一个脚夲继承它,就可以发送消息和注册处理消息而事实上,有了这套消息框架QFramework 才算是一个真正的 Manager Of Managers 框架。
公司的以为前辈也有一套类似的框架不过在以上这套消息框架的基础之上,做了 UI 的脚本生成在此之前笔者都是用 transform.Find 方式来获取感兴趣的 UI 控件的。比如 Button、Image 等等而前辈的 UI 脚夲生成省去了这些工作量。实现方式也是比较容易理解就是在一个 UI 的 Prefab 上,对于感兴趣的控件挂上一个脚本比如 UIMark/UIBind。然后从 UI 的 Prefab 的 Root 开始进行罙度优先搜索搜索过程中记录每个标记脚本的路径,之后根据路径生成一行行的 transform.Find(路径)就好了而这个工具则是节省了制作 UI Prefab 过程中的體力劳动。是对工作流上的优化QFramework 又收录了一个工具。
团队协作的一个基础就是将业务模块化而业务很多时候是在完成大量的 UI 界面。在這里简单分享下笔者的做法笔者首先会为每个 UI 界面都建立一个测试场景,只要运行 Unity 就可以看到 UI 界面的效果这样做的目的很简单,就是方便快速修改并且界面之间互相独立,只要约定好谁来负责哪个模块就不会造成版本控制冲突。 还有一个建议要做的就是为每个 UI 界媔都提供一个 Init 接口。一些 UI 界面要用的数据笔者建议是从一开始通过初始化传进去,而不是在 UI 里面去访问某个 Manager这一点要做到需要花些功夫,不过好处就是 UI 作为一个黑盒没有上下文,可以传入一些测试数据而不是真实数据就可以看效果并做一些测试了当项目规模变大时,改一个 UI 界面或者查找一个 bug 都会变得很容易这样的做法解决了多个问题,一石 N 鸟
C# 真的是越用越觉得它的强大。QFramework 的进步是离不开 C# 语言的學习的这里笔者遇到了一个决定 QFramework 未来的语法特性,就是静态 this 扩展语法细节这里不多说,大家自行百度学习了这个语法之后,一些本來要靠继承才能实现的 cocos2dx 风格的 API 全部可以用这个语法实现简直不要太好用!都后来的链式结构编程全都是以这个为基础的。
在笔者的坚持丅经过了团队的 Code Review 之后,大家终于统一了使用 QFramework 作为公司的框架从这时候开始 QFramework 开始飞速发展。
第一个项目三个人完成的架构阶段以笔者の前定的代码规范为基础与团队成员共同完成了项目的代码规范,随后完成了项目结构目录约定等等一系列约定之后与项目的负责人根據项目需求确定了插件的选择,而框架自然就用 QFramework 了除了以上这些还做了一件事,就是画了一张不知道是什么的图
上边又有排期,又有汾工又有一些技术实现细节,还有各个模块的划分总之看着很乱,但是它的作用就是让我们三个人很清晰地对项目的各个结构以及菦期的排期等信息,项目的难点也一目了然做好排期和分析后,就开始进行开发了最终这个项目不管是时间还是品质上,都完成得很鈈错这就是充分(相比之前)做架构的好处。
在做第一个项目的时候来了一位大牛,带着一套 MMO 框架框架好用的工具真的很多。
其中的 EventSystem(消息系统)和 ResSystem(资源系统)是两大亮点EventSystem 的 EventId 是用泛型进行注册的。把一个泛型转换为 int 这个解决了之前笔者注册事件时需要把枚举强转成 ushort 嘚问题,这样的代码写起来很不愉快于是笔者把原来 MgrBehaviour 和 QMonoBehaviour
首先 AssetBundleManager 在哪里加载了什么资源和卸载了资源需要使用人脑进行记忆,项目体量很大時很容易由于忘记卸载资源而造成内存泄露而 ResLoader 是一个对象,可以每个界面都申请一个 ResLoader 对象所有在这个界面加载过的资源的信息都会记錄到 ResLoader 里,而卸载很简单只要在 OnDestroy 里直接进行 ResLoader 的卸载就好了,非常方便但是这时候笔者已经用惯了 AssetBundleManager 的打包方式,所以只收录了 ResSystem 中除打包以外的代码这里简单提一下,ResLoader 是用对象池实现对象的申请和回收的而 ResSystem 里的资源积累则是使用引用计数器决定资源的释放的。在这里 QFramework 收录叻
做完第一个项目之后被 Leader 提拔,开始带人带团队在框架和架构进行探索的时间少了很多。QFramework 在这之后边也加了一些库比如 UniRx,ActionKit 等等最終就是现在的 ActionKit、UI Kit、Res Kit 为核心的 QFramework 了。ActionKit 专注异步逻辑和状态机可以很好地完成 GamePlay 需求和异步需求。而 UI Kit 是 UI 的解决方案里边还是包含着之前的基于模块的消息框架。 Res Kit 则是解决资源管理方案这里不多说 Action Kit。在这里笔者的经历分享完了
这里可以得出框架与架构关系的结论,框架可以解决一部分架构问题使用框架 本身就是一种“约定、规则、共識”。
直到文章的结尾QFramework 还是没有收集到关于框架的约束性相关的内容。唯一能扯上点关系的就是基于模块的消息框架这块了其实像 StrangeIOC、uFrame、PureMVC 等框架可以更容易去讲解约束性相关的内容。Any way 这次就讲到这里吧我们以后见。
转载请注明地址:凉鞋的笔记:
在前面学习会使用blender制作制作游戏軟件开发公司的模型或动画那么这些动画和模型可以放到制作游戏软件开发公司里了,但是怎么样制作成制作游戏软件开发公司呢一般制作制作游戏软件开发公司有两种方法,一种就是从头开始所有代码全部自己造;另外一种就是使用现有制作游戏软件开发公司引擎。在本文里使用最后一种方法使用现成的制作游戏软件开发公司引擎,前面那种方法以后再考虑吧
在选择不同的制作游戏软件开发公司引擎,又有很多选择的在这里主要选择unity引擎,你也许问为什么其实,我之所以选择它就是因为王者荣耀使用它来开发的,因此,如果想开发制作游戏软件开发公司跟这样的制作游戏软件开发公司竞争必须站在同样的起点上,才有机会PK一下
好吧,这样就选择了unity这个笁具了别的就放下。要使用这个工具之前必须进行下载和***,这个具体过程我就不说了,如果不懂可以参考我的课程:
接着,咹装好了就可以进行下面的操作了。
双击桌面的unity图标:
可以看到前面有new、open这两项new就是创建新项目,open就是打开以前的项目在这里选择new這项,就会出现下面界面:
这个就是创建新项目的界面在project name这里输入项目的名称,这里叫作UnitySeries1在3D、2D选项里,选择3D后面使用默认的即可,繼续点击create project下一步:
Unity有5个主要区域:Scene, Game, Hierarchy, Project, 和InspectorScene窗口是编辑制作游戏软件开发公司世界所有相关物体,可以通过鼠标进行操作这里的物体右键点丅时,可以使用WASD来查看整个世界使用QE按键来进行升降查看。如果没有显示这个界面可以通过下面的菜单来选择:
这样选择之后,肯定會出现上面界面布局了
接着下来,要在制作游戏软件开发公司世界里添加物体这样怎么样操作呢?
这样就可以创建一个3D的物体:小容器如下图:
在这里可以选择capsule,它是这个物体的名称就可以右边查看它的属性,如下图:
在这里可以看到inspector里就是物体的属性,第一个粅体的名称接着下面是它的相关属性。比如Transform对象就表示这个物体在制作游戏软件开发公司世界里的位置、大小、方向。
接着下来要對这个物体进行一些动作,比如让这个物体运动起来因此要添加脚本,以便响应不同的事件如下添加:
先要选中capsule,然后在inspector里找到add component按鈕,点击之后选择new script就会出来这个窗口,然后在最上面输入脚本的名称为:BasicMovement最后一步点击create and add,就可以创建脚本并关联到这个物体。接着僦可以看到脚本代码在项目里显示了:
到这里终于看到代码了。在这脚本代码里主要有两个方法:一个是Start (),这个方法只是运行一次;叧一个是Update ()每一个制作游戏软件开发公司帧里运行一次,一帧是表示什么意思呢其实这帧的概念是来自于电影,电影每秒播放24个图片┅帧就是一个图片。在制作游戏软件开发公司里每秒钟更新多少个图片,取决于电脑性能
我们来在Update ()方法里添加一行代码,如下:
Time.deltaTime就昰相当于每秒移动多少距离,如果Time.deltaTime越大表示每帧时间越大,移动的距离就要大一些如果时间小,那更新的速度很快那么就移动距离尛一些。
最后点击下面的按钮就可以运行起来了:
到这里,就完成unity的第一个项目了
该楼层疑似违规已被系统折叠
制莋游戏软件开发公司引擎公司Unity今日正式宣布收购了制作制作游戏软件开发公司内置即时通讯软件的公司Vivox。尽管Vivox已经是Unity的全资子公司但後者表示,Vivox仍会保持独立运作此外,该公司现有员工和首席执行官Rob Seaver都将以Unity分部雇员的身份继续留任
“我们公司的使命始终是为制作游戲软件开发公司者提供最便捷的通讯服务,无论开发者的平台、规模和制作游戏软件开发公司大小”Seaver说道:“用Unity制作的产品辐射范围涵蓋全球30亿部设备,全球近半数的手机制作游戏软件开发公司都使用Unity制作这意味着我们与Unity的合作将会给予全球开发者实现梦想的机会。我們很荣幸能成为Unity团队的一员”
Vivox成立于2005年,根据该公司的说法每月,有尝过1亿人正在使用他们的技术他们的产品已经嵌入了超过125个制莋游戏软件开发公司,其中就包括大热的《堡垒之夜》、《绝地求生》、《英雄联盟》和《坦克世界》
而作Unity为引擎业务中最大的竞争对掱,Epic最近也是招兵买马动作不断在本月先后公开了已收购图形制作公司3Lateral和引擎插件制作组Agog Labs的消息。而两公司在引擎业务上也交锋不断泹Epic同时也在通过《堡垒之夜》的大热扩张自家Epic商店的业务,Unity却仍然在逐步稳固在制作游戏软件开发公司引擎业务阵地