前言
游戏引擎主要用于快速开发游戏,将游戏中固定不变的处理抽取出来,形成完整的游戏主体,用户只需要对开放的接口进行对象设计和驱动即可。在当前的环境,还需要两个特别重要的属性,第一就是跨平台(基本标准),还有一个我觉得更重要是社区的系统,没有强大的网络社区做支撑,再牛B的游戏引擎都很难发挥所长。
名词解释
1
游戏引擎
即游戏程序的核心组件,也叫主程序。玩家所体验到的游戏表现方式、关卡地图类型、美术效果、声音、操作性等内容都是由游戏的引擎直接控制的,它把游戏中的所有元素捆绑在一起,并在后台指挥它们同时、有序地工作。简单地说,引擎就是:用于控制所有游戏功能的主程序,包括程序运行主流程、地图驱动、图形驱动、声音驱动、物理引擎,交互和AI。
2
游戏引擎框架
用于将游戏引擎中各部分的驱动协调起来,并体现在游戏主程序的运行流程中,同时在其内部处理了游戏程序必备的,但各游戏程序基本相同的操作(如初始化、资源释放等),减少了游戏程序人员做“体力”劳动的工作量,把精力放在游戏设计本身和对象行为驱动上,程序员只要设计游戏中具体对象的驱动和其之间的联系即可。
设计思想
1
游戏引擎提供的功能
目前主流的游戏引擎提供如下功能可以概括如下: 学习一个游戏引擎,一般也是从下面这几点出发.
地图编辑器: 一个好的游戏引擎需要搭配一个好的地图编辑器。unity3d和 cocos2d都把地图编辑器集成到了游戏引擎里面(虽然cocos2d并没有做得特别好,不过由于它的可扩展性,).
渲染系统: 相对于开发人员,玩家更注重的游戏的画面,那么渲染系统重要性就体现出来了。渲染的流畅和出色的画面,一直是玩家衡量一个游戏引擎的标准。当然考虑到硬件设施和成本,PC和手机端目前还不是一个档次。为了抢夺游戏市场,一些牛B的游戏引擎厂商也纷纷把矛头都转向了手机游戏,例如Unreal.
资源管理和打包机制:在这个网络发达的年达,游戏的升级更新是必须的,所以打包策略和方案显得尤为重要。Unity资源打包有Assetbundle,cocos2d可以采用zpack,zip等,cocos2d本身并没有打包的策略,资源容易被获取到,不方便加密。
内存管理:自动申请和回收机制,模板式的代码能减少程序员编写代码的负担,减少开发过程中的BUG。同时也降低编码的难度。 那Cocos2d-x作为例子,Cocos2d-x中所有对象几乎都继承自Ref基类,Ref唯一的职责就是对对象进行引用计数管理:
代码语言:javascript复制class CC_DLL Ref
{
public:
void retain();
void release();
Ref* autorelease();
unsigned int getReferenceCount() const;
protected:
Ref();
protected:
/// count of references
unsigned int _referenceCount;
friend class AutoreleasePool;
};
当一个对象被使用new运算符分配内存时,其引用计数为1,调用retain()方法会增加其引用计数,调用release()则会减少其引用计数,release()方法会在其>引用计数为0时自动调用delete运算符删除对象并释放内存。
例如cocos2dx里面的对象通用的创建代码
代码语言:javascript复制#define CREATE_FUNC(__TYPE__)
static __TYPE__* create()
{
__TYPE__ *pRet = new(std::nothrow) __TYPE__();
if (pRet && pRet->init())
{
pRet->autorelease();
return pRet;
} else
{
delete pRet;
pRet = NULL;
return NULL;
}
}
用户只需要调用 XX::create() 函数之后,就可以不用去管内存的回收了,很方便。 引擎的目的,就是为了方便开发。 交互设计:将用户的输入操作进行处理和封装,开发人员 只需要使用相关接口就能够知道 物理引擎:unity3d内置了NVIDIA的Physx物理引擎而cocos2dx也基于box2d的物理引擎进行了封装。对于物理世界的定义和驱动,仿真就是来自这些系统。 开发人员只需要往你的场景和对象添加物理属性,就可以使用。 场景驱动:根据需求游戏引擎提供场景的创建,开发人员进行逻辑的驱动,是开发游戏常用的一种模式。 对象驱动:精灵是游戏开发里面一个基本概念,无论自己设计的引擎,或者例如cocos2dx 里面的Sprite,unity3d里面的GameObject。所有的事情都需要通过这个概念发生关系.
坐标系 : 在图形图像和游戏应用开发中坐标系是非常重要的,我们在Android和iOS等平台应用开发的时候使用的二维坐标系它的原点是在左上角的。而在Cocos2d-x坐标系中它原点是在左下角的,而且Cocos2d-x坐标系又可以分为:世界坐标和模型坐标。unity3d坐标系包含了世界坐标,屏幕坐标,视口坐标,绘制GUI界面的坐标系。关键是弄清楚各种坐标系之间的关系和如何进行转换。 消息驱动:消息循环、消息预处理、消息处理,消息回调用于在游戏运行的整个过程中不断检测是否有因玩家的操作而触发的消息,并将消息分发到游戏框架的消息处理程序中,供程序设计人员编写消息处理驱动。 定时器驱动:是游戏正常运行时的主驱动,提供了游戏运行的各个阶段的各种可能的操作,是游戏运行的核心模块,也是开发人员核心编写逻辑驱动的地方。典型的,其中在游戏的正常处理状态中,需要按键处理驱动,用来处理用户的输入操作,如按下按键,这些操作将会产生什么影响,就需要各游戏的程序设计人员编写代码。然后处理对象驱动,包括用户控制的角色对象、电脑控制的角色对象,或其它随机的对象,主要驱动这些对象的位置、状态、行为等逻辑方面的内容。在处理对象的驱动过程中,对象有可能会相互碰撞,故需要碰撞检测模块参与碰撞检测,并将检测结果反馈给游戏程序,共游戏程序进一步处理。最后一步就是显示,包括显示游戏背景、显示各种游戏对象及游戏UI。 声音和视频驱动:初始化及关闭等功能,为游戏中播放游戏背景音乐、音效初始化和关闭声音设备。 动作 Aciton : 游戏过程中包含了各种各样的action。让对象做各种事情就靠它了。
2
工具的使用
工欲善其事必先利其器,强大的游戏引擎,强大的的并不仅仅是引擎本身,而是各种各样的工具,使用好各种工具,会让你开发效率大大提高。例如你想学习好cocos2dx, 除了 本身的引擎,你更加需要的是cocos studio, TexturePacker,各种类型的地图编辑器等等,有能力的还可以自己开发工具。
1
脚本系统
cocos2d 有lua脚本系统,unity3d 的脚本系统可称之为游戏运行核心,所有的设计本身都可以围绕脚本展开,包括AI设计。自定义脚本系统也可以,甚至可以使用txt文本或者excel这些比较常见的格式。
关于选择引擎
“我现在有个项目应该用unity还是cocos2d”这个是一个长期需要考虑和讨论的问题,就好像你高考填志愿是选“清华”还是“蓝翔”,不是简单的一个“开发2D游戏用cocos2d,开发3D游戏用unity”的能够回答的问题。但是作为目前开发手游所采用最为普遍的两种技术方案,是具有可比性的。
1
人才考虑
需要考虑到项目的人员安排情况,到底熟悉什么语言。公司招揽以后发展的趋势。这个是优先考虑的。
2
技术支持、社区支持
。如果是选cocos2d或者unity3d这两种引擎都挺火的,暂时可以放心使用。相对比较下cocos2d比较有优势,国内社区的unity3d解决的问题都比较初级,一些比较困难的技术问题和方案基本都要去官方论坛进行提问。当然如果你能浏览英文网页OK,这个情况就倒过来了,毕竟像cocos2dx 这是国人的杰作。还有一种问题自主开发的的游戏引擎就没有这种问题了,完全由自己掌握。团队带起来也快。
3
学习与使用
虽然技术层面unity和cocos2d是完全不同的东西。cocos2dx 完全就是一个类库,由各种组件组成。可扩展性很强。而unity3d 是提供了相当于一整套的解决方案。两者虽然都是跨平台,unity3d 明显做的比较优秀,不限于手游方面,甚至在VR领域也有一席之地。学习难度方面,cocos2dx 的可视化编程没有unity3d做的好。unity3d 相对于编程基础比较差,甚至于没有学过编程的都容易入手,一些开发项目其实如果美术工程师能熟悉unity3d的界面交互,他们都可以开发。当然如果你本身就是是C 的开发人员,cocos2dx 就信手拈来了。
总结
无论是自己开发的游戏引擎进行开发,或者现在流行的cocos2d引擎和unity3d引擎,这些心得是整合引擎编写经验和后面学习的经验进行论述,欢迎提出批评和指正。