浅谈Unity3D手机游戏开发框架
发表于2016-05-12
文章目录
为什么游戏界急切需要一站式开发框架?
举个例子
游戏开发是怎样的开发架构?
举个项目周期例子
Unity3D资源加载模块 (ResourceModule)
UnityEngine.Resources类
AssetBundles打包资源
UI模块(UIModule)
为什么游戏界急切需要一站式开发框架?
以往我们在做Web开发时,总是拿来主义,需要开发后台Web程序,先找MVC框架,需要开发前端网页,先找来CSS框架,需要前端动画,先找JS框架,基本上没有一样东西是自己用心编写的。

进入游戏开发行业以来,我更多接触到的是C++开发程序员,他们更多的讲究高性能和优秀算法,他们能出色的完善某一个细节功能(比如:IP字符串解析成二进制),对底层有无尽的追求,可是他们使用C++的整体架构,却让我生厌:没有事件驱动编程概念、没有依赖注入概念、没有低耦合概念。简而言之, 他们更关注细节实现,而不注重整体设计。
我接触过Ruby、PHP、Java、C#、NodeJS的开发框架,可以说,它们归根到底都是一个概念——MVC,此外还萌生出很多很炫的概念字眼:IoC、Vo、面向切面编程、Scrum等等。
可是在我接触K公司的游戏程式员时从未曾讨论过这些字眼,感觉这些概念在游戏编程领域感觉缺乏一个标准。纵然是这么一个国内著名的游戏,里面使用的C++高耦合和依赖程度还是令我挺震惊的。
举个例子
游戏里需要加载一个NPC时:NPC类找Resource类进行加载,发现加载失败了,Resource类找UI类进行输出,同时Resource类主动找NPC类,说没资源,NPC先用个问号代替吧。
这里面就有3层关系,NPC、Resource、UI,它们有很深的依赖关系——NPC->调用->Resource->失败->调用UI和Resource,
在我看来,这里依赖的层次,能用事件驱动编程解耦:
NPC对Resource依赖,NPC首先注册加载失败事件
NPC调用Resource加载->Resource失败->触发失败事件(函数指针)->NPC收到事件->NPC调用UI
这样一来,依赖关系变成了, Npc-> Resource 和NPC->UI。 Resource和UI之间河水不犯井水。
或许你会说,这只是节省了一层依赖,没什么影响啊。可是,别忘一个情况:一个游戏项目,无可避免的有上百个类、上千个函数,当它们的依赖互相交织在一起时,就会让人晕头转向了。同时你也可以思考下,如果我想复用代码到另一个项目,应该怎么改动呢?答案是你必须把大量的交杂依赖代码删掉,才能让它最基本的运行起来。
而这,我认为就是K公司和K系列创业团队6*12加班文化的起因——过高耦合的代码->无法复用的代码->晕头转向的类关系->代码负债->延长工作进度来还债。
我个人认为,一个良好设计的开发框架:高内聚、低耦合、合理的模块依赖,能令老板省钱,省下加班费买豪车;员工省时,保持清醒回家性福。 这可以说是一个游戏开发团队最基础的地基。然而残酷的现实却是,大牛们都很忙,项目会赶,没时间开发框架,就算开发了框架,也懒得告诉你,即使开源了,不教大家也不懂用啊。
综上所述,让我决定分享Unity3D开发框架的一些个人的方法。
以上主观经历,只是我所接触的K公司程序员的特色而已,仅代表我的个人的某项目经历,不代表整个游戏行业。
本文建议需要有一定的Unity3D游戏开发基础知识,鉴于Unity这个单词总会和微软的Unity IoC框架冲突,所以本文索性全部叫Unity3D,如果出现Unity单词,是个撰文BUG。
游戏开发是怎样的开发架构?
在Web开发时,MVC设计模式可谓统一江湖:模型(Model)-视图(View)-控制器(Controller),简单说模型M负责数据库,视图V负责界面显示,控制器C负责将M输出到V, M和V共同依赖C, M与V无依赖,河水不犯井水。MVC概念随便网上一搜文献一堆,不多叙述。
而在游戏开发,由于本身的功能需求要比Web开发复杂得多,设计模式是多样性的,总体来说我归纳成三个部分:资源加载(Resource)、用户界面(UI)、游戏逻辑(Logic),暂且我们简称它们RUL。
举个项目周期例子
假设制作一个象棋游戏,启动游戏,首先就是加载资源(用到了Resource模块),这个是什么资源?是一个UI界面资源,使用UI模块打开它, 点击“开始游戏”,调用游戏逻辑Logic,至于游戏Logic是怎样,根据每个项目的需求而定了。
Unity3D资源加载模块 (ResourceModule)
由上可见,资源加载是游戏开发的第一步,而我也认为资源加载是客户端游戏开发过程中最重要的一环,它直接与你应用程序的内存占用大小、硬盘占用大小相关。Unity3D引擎中一般有两种资源加载方式:使用UnityEngine.Resources类或AssetBundles。
UnityEngine.Resources类
比较直接的方式,使用方法Resources.Load,一个资源就抓到了
优点:方便、易用、智能处理依赖
缺点:同步加载、低灵活性,跟应用程序紧密的绑定在一起,无法剥离
AssetBundles打包资源
Unity Pro才开通的功能,基本见到大部分商业项目都使用,因为游戏需要做动态更新嘛,打包后的AssetBundles可以从网络动态下载,但是assetbundles是需要手动打包和读取的,资源的依赖关系也要特别处理。
优点:高灵活性、高压缩率、异步加载
缺点:不易用,需要自己开发资源打包工具
在我们进行项目时,ResourceModule资源加载模块通常都是最初就应该设计的,它应该是独立的,对所有其它类无依赖,在CosmosEngine中,ResourceModule默认使用AssetBundles进行加载,可在配置中修改加载模式。
UI模块(UIModule)
Unity中,NGUI插件十分的常用。NGUI自然也是我的UI插件之选。
当然此前我还使用过1年多EZGUI,那段痛苦的时光,字体渲染、面板裁剪、屏幕分辨率适配等等一堆功能都要自己实现,一眨眼几个月过去了,被改得满目苍夷的EZGUI却有无穷无尽的BUG,当然那时候NGUI也没有像现在那么全能,但这也折射出了K公司的部分人马是有多喜欢底层开发。
回到正题,这是不是意味着UI模块,使用插件,没有办法抽象成框架了?非也,我们需要从使用ResouceModule加载出UI,再到具体的UI插件处理是不是?这就有抽象的空间了。
这里,MVC中的V(视图)C(控制器)是该重出江湖,有VB开发应用程序经验的人应该知道。
本文系作者 问说网 授权问说网发表,并经问说网编辑,转载请注明出处和 本文链接。
本站文章除注明转载外,均为本站原创或翻译,欢迎任何形式的转载,但请务必注明出处,尊重他人劳动。
转载请注明:文章转载自:问说网 » 浅谈Unity3D手机游戏开发框架
本文标题:浅谈Unity3D手机游戏开发框架
本文地址:https://www.uedsc.com/talking-about-unity3d.html