随着微信生态中,小程序应用指数级的增长,许多休闲游戏变成为了众多游戏厂商流量变现的新手段。以近期很火的“羊了个羊”为例,它便是我们常常所说的小游戏。
要盘点小游戏开发引擎之前,我们得先来了解下游戏和小游戏两者之间的区别。
最核心的区别便在于运行环境的不同。基本上所有基于 HTML5 的游戏引擎都是依赖浏览器提供的 BOM 和 DOM API 的,而小游戏的运行环境是一个不同于浏览器的宿主环境,没有提供 BOM 和 DOM API,在微信中提供的是 wx API。通过 wx API,开发者可以调用 Native 提供的绘制、音视频、网络、文件等能力。、
换句话说,如果用一个游戏引擎开发了一款游戏,如果要运行在App中,还需要引擎自身适配微信小程序的语法。
那么现在有多少游戏引擎适配了呢?官方的文档上介绍的是:Cocos、Egret、Laya以及Unity。最近了解到有一个小程序容器技术FinClip,能够让运行在微信上的小游戏,同样运行在其他App中,感兴趣的小伙伴可以了解一下这个产品。
最近看到FinClip举办小游戏体验测试,奖品挺丰厚,感兴趣的同学可以去瞅瞅。
下面我们主要对这4款游戏开发引擎做介绍及优缺点的比较。

图片来源于微信开发者文档
必须得把Cocos放在第一个讲,毕竟近期的羊了个羊就是基于Cocos引擎开发的。除了 " 羊了个羊 ",采用 Cocos 引擎开发的知名游戏还有《梦幻西游手游》《开心消消乐》《捕鱼达人》《热血传奇》《最强蜗牛》《剑与家园》《动物餐厅》等等爆款游戏。
编程语言:js,C++,lua
很多策划认为Cocos2D对于新入行的开发者来说不仅具备大量功能,而且非常容易上手。虽然该引擎比较复杂,但值得一提的是其功能和灵活性。
优点:强大而且灵活;理论上来讲,你可以为自己的游戏加入所有的iOS功能;提供成熟的框架和多种工具;开源、免费,社区支持强大。
缺点:和同类引擎相比比较复杂;学习门槛相对较高;特别适合Mac或者iOS平台,不过并不是跨平台引擎。
概述:cocos2d-x 的编程语言有不同的版本,是相对来说抽象比较少的引擎,也是我接触较少的一款游戏引擎,技术有点老了。

Egret引擎是一个开源免费的游戏框架,用于构建二维游戏、演示程序和其他图形界面交互应用等。Egret使用TypeScript脚本语言开发。当游戏完成最终的打包后,可以将程序转换为HTML5游戏,实现跨平台特性。
Egret不仅仅是一个基于HTML5技术的游戏引擎,我们的产品线中除了Egret引擎还提供了很多辅助游戏开发的工具。准确的来说,Egret是一套游戏开发的解决方案。你可以使用Egret引擎来帮助你开发HTML5游戏,并运行在手机和PC端的浏览器中,同时也你可以使用Egret提供的相关工具搭建你自己的游戏开发工作流。

Layabox是北京蓝亚盒子科技有限公司打造的中国游戏引擎提供商品牌,旗下第二代引擎LayaAir是基于webGL的开源引擎,性能与3D是引擎的核心竞争力。配套引擎专属的可视化开发工具,引擎与工具同时支持ActionScript3、JavaScript、TypeScript三种开发语言,并且一次开发可以同时发布APP(安卓与iOS)、HTML5、小游戏(微信小游戏、QQ小游戏、百度小游戏、支付宝小游戏、BiliBili小游戏、字节跳动小游戏、小米快游戏、OPPO小游戏、vivo小游戏、华为快游戏、等)。除支持2D\3D的游戏开发外,引擎还可以用于应用软件、广告、营销、教育、线上虚拟展馆、智慧城市、智慧工业等领域。
LayaAir引擎是一套全新设计的精简API的游戏引擎,具有极致的性能、轻量易用、支持多语言开发、API功能齐全、工具链完善高效、免费、支持多版本发布等特点。

Unity3D对于游戏开发者们来说是一个真正可以负担的起的引擎,具有其他引擎难以匹敌的用户量。更为重要的是,你只需要付费一次,而且,不管你的游戏如何成功,都不用担心Unity会分走你的收入。这对于很多开发商来说当然是非常具有吸引力对,尤其是初创公司和新入行的开发者们。
优点:业内最具竞争力的授权条款;易于使用而且兼容所有游戏平台;开发者社区支持强大;学习门槛非常第;开发商使用率最高。
缺点:工具数量有限,所以开发商必须给自己创作工具;做复杂和多样化的效果比较耗时。

以上四种小游戏开发引擎,你钟爱哪一个呢?如果你有其他钟爱的小游戏开发引擎,欢迎您在评论区留言。
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput
我想在一个没有Sass引擎的类中使用Sass颜色函数。我已经在项目中使用了sassgem,所以我认为搭载会像以下一样简单:classRectangleincludeSass::Script::FunctionsdefcolorSass::Script::Color.new([0x82,0x39,0x06])enddefrender#hamlengineexecutedwithcontextofself#sothatwithintemlateicouldcall#%stop{offset:'0%',stop:{color:lighten(color)}}endend更新:参见上面的#re
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象