如何快速开发一个小游戏?
如何快速开发一款流行的小游戏?“流行”是一个部分操作的词。在小游戏推出120天后,微信开发者官方账号上有一条推文,其中几个可能用来描述“流行”这个词。截至微信游戏正式允许第三方开发者发布已有22天,对外发布的小游戏有300多款,注册用户总规模超过1亿款,安卓月流量超过100万款。
这篇文章还提到了两种与火爆有关的姿势。一是社交匹配。在小游戏分散化的背景下,将游戏内容与微信社交网络相结合是一个非常重要的点。同时,开发者还需要在利用社交互动来提高用户体验和群聊分享之间选择一个平衡点。二是操作简单,说游戏易用,操作简单。这是我们根据游戏成为热门风格后观察到的结论。这并不意味着有了这两个特点,我们就可以开发出一款热门游戏,新的热门游戏也不一定符合这些特点,仅供参考。
今天介绍的内容更倾向于技术,所以“流行”从标题中删除,不会介绍如何开发具体的游戏逻辑,而是更倾向于利用微信的开放能力开发一个小游戏。
什么是“小游戏”?什么是小游戏?
首先,让我们介绍一下什么是小游戏。从普通用户的角度来看,小游戏是小程序的一个子类别,可以在微信上方便地获取和传播,即时玩耍,具有优秀的用户体验。小游戏是一个小程序,普通用户无法区分,也无需区分。
Runtimeme小游戏
假如Runtime放大了游戏,就能看到许多细节,这是一种典型的分层结构:
上蓝色部分是游戏代码,分为游戏逻辑、游戏引擎、weapp-adapter三部分。大多数游戏开发将使用一些引擎工具、工作流和高层API来实现游戏逻辑。二是weapp-adapter,一方面,小游戏的底层不是webview,可以简单地看作是webview经过精简和优化的平台;另一方面,实现核心能力是指webview。因此,如果这里有一个适配器,小游戏的底层API——wx API适应接近webview的接口,更容易接入上层引擎和现有游戏的微信小游戏平台。这就是weapp-adapter的作用。只有游戏逻辑是必要的。
由此可见,小游戏和小程序在架构上是有区别的,小游戏没有页面概念,wxss/wxml不再存在。其次,底层实现不是webview。小游戏和webview的关系只能说是渲染相关的核心能力,可以通过weapp-adapter的简单适应来保持接口一致,但同时很多webview上的功能并没有平等实现。比如小游戏没有dom/bom的概念,也没有全局的document/window对象。
小游戏的入口是game。 js文件,语言是Javascript,但是有一些限制,比如禁止执行动态代码,所以eval、new 不支持Function等能力。配置为game.json,横竖屏、接口超时等参数可配置。wxs可以组合在js中 实现游戏逻辑的API能力, 非代码资源应尽可能放置在CDN中,以减少整个代码包的大小,以加快用户第一次进入时的速度。微信目前将第一个包的大小限制为4MB。
Webview Adapter
让我们来谈谈Webview Adapter,它的初衷是让游戏开发者更好地熟悉我们的平台,所以我们的平台会尽可能多地适应webview。事实上,这种适应也是一个非常简单的层次。例如,我们使用image对象在浏览器中创建一张图片,而在小游戏中,我们使用wx.由createimage创建的,需要在代码中做一个简单的适配。
以此类推,常见的Canvas、document对象在adapter中通过简单的适应实现,可以研究链接中的代码。之后官方不会继续维护这个adapter,我们会更加注重底层能力的建设。
小游戏能力概览
下图是对小型游戏能力的概述。小型游戏能力迭代相对较快,有些能力还没有时间列出。例如,最近刚刚发布的游戏圈,一些与健康系统反成瘾相关的界面。
先来看看基本能力,渲染这部分WebGL1.0和Canvas 支持2D,这里的Canvas更接近浏览器中的标准。同时,如果小游戏在后台运行,这里提到的可控帧率概念可以尽可能降低帧率。
在多媒体部分,小游戏无法像小程序一样实现实时音频和视频流,这是我们未来需要进一步支持的。网络IO部分类似于小程序。我们还提供了一些UI组件,如拉动键盘、模态对话框等。
小游戏的社交开放能力现在是外部的。最重要的能力之一是在开放领域向开发者开放微信的朋友关系,并考虑到对用户隐私保护的一些设计限制。
由于小游戏分散的特点,分享这部分也非常重要。开发人员应该考虑如何利用这种能力。在代码方面,由于第一包限制为4MB,一些小游戏的代码量可能相对较大。我们最近也在计划分包能力,允许异步加载和执行代码,但必须由我们审查。
如何开发一个小游戏?
那么如何开发一个小游戏呢?因为我只开发了一些简单的游戏,而不是专业的游戏开发,接下来我将介绍如何利用微信的能力开发小游戏。
选择小游戏引擎
微信也与引擎提供商密切合作。一般来说,当前的游戏引擎将支持多个平台的发布。对于微信小游戏的新平台,一些引擎已经适应了,比如Cocos Creator、Egret Engine和LayAire Engine。适应的主要工作类似于前面提到的weapp-adapter,把wx 与引擎相连的API能力。
例如,引擎通常将小游戏平台与webview平台进行比较,适应过程是将wx API对应webview的能力,同时去除只存在于webview能力的依赖,比如不再依赖bomm、DOM。所有适配的引擎都有相应的文章介绍如何将游戏发布到微信小游戏平台。
设备/环境适应
小游戏将具备API获取屏幕宽度、设备像素比等能力。小游戏开发完成后,开发人员工具也可以启动真机测试请求。微信提供不同设备的测试集群,帮助开发人员提前发现问题。基础库提供wx API本身就是一个不断迭代和更新的过程。对于使用新能力的小游戏,需要做低版本兼容性。
微信登录
小游戏的登录过程类似于小程序。用户需要定义登录状态。appsecret/session_key代表了小游戏开发者和微信平台之间的信任协议,如支付和上报托管数据。平台方需要验证access_token(只有appsecret才能交换),与用户相关的需要验证session_key的签名,以确保请求来自小游戏开发者/用户,而不是恶意的第三方和随意捏造的用户。
access_token是access_token,与用户无关,需要保证全局维护。应该有一个中央控制模块,以确保acces_token有效,并在有效期内直接使用本地cache的acces_token,并非每次使用时都会生成新的access_token,否则,调用频率限制的错误可能会影响服务。记住appsecret//session_key不应该放在前端代码中,否则坏人可能会损害小游戏开发者/用户的权益。
缓存
缓存类型包括数据缓存和文件缓存。数据缓存是key-value存储,适用于结构化小数据存储,上限为10MB。文件缓存提供了一个完整的文件系统API,包括目录/文件的添加和删除,适用于经常使用的网络资源的本地缓存,上限为50MB。
与浏览器不同,微信只提供基本的存储管理能力,而不是存储什么,以及存储满时删除什么。开发人员灵活定义缓存和淘汰策略,如将经常访问的资源存储到文件系统中,并在文件存储满时清理一些最近不经常访问的文件。
开放数据域
开放数据域是封闭和独立的 JavaScript 功能域和执行游戏逻辑的环境被称为“主域”隔离。其目的是在保证用户隐私的前提下向第三方打开用户数据,提升小游戏的整体用户体验。以下是物理视图,主域入口为game.js,开放数据域是一个独立的目录,其入口文件是index.js。
严格控制主域和开放数据域的通信,基本原则是只进不出。
•只进:允许外部数据进入开放数据域,即主域可以随时通过postMessage进入开放域,开放域可以引用主域准备的本地资源
•不“出”:不允许开放数据域的数据上传到第三方服务器。因为数据域是开放的,index.js可以直接访问用户敏感数据,比如玩好友数据。当然,最终开放数据域需要index.综合各种数据后,js以图形图像的形式将数据渲染到sharedCanvas上,允许draw在主语sharedCanvas上的主域上屏Canvas上,最终用户会在显示屏上看到game.社交互动信息,如js绘制的朋友排行榜、群排行榜或朋友超越。
在开发数据域中的数据中,开发者无法将数据取出并与游戏数据相关联。因此,如果游戏数据需要显示在开放域下,如分数,开发者需要通过报告界面将数据托管到平台上。这样,相关数据就可以在开发数据域中获取,其应用场景包括朋友排名、群列表、超越朋友提示等。
分享
包括自定义共享和系统菜单共享,可以分享给群聊和单聊。也可以将上下文与特定群相关联,实现一些群PK、小组排名的场景。分享是一把双刃剑,需要谨慎使用。一方面要避免过度骚扰用户/群聊,另一方面要找到合适的平衡点,增强社交互动,提供良好的游戏体验。
支付
小游戏支持Android下的虚拟支付,目前只有一种方式:货币托管。主要分为两个过程:
1.充值:RMB -> 在这里,开发者只需要拉起支付流程,平台负责将用户RMB兑换成相应的游戏币,并将其存储在相应的游戏帐户中
2.使用游戏币购买道具:开发者可以扣除相应的游戏币,向用户分发游戏中的道具。扣除游戏币的过程需要一定的交易机制,以确保正常的交易在网络异常的情况下进行。扣除游戏币的界面支持根据订单id进行重复,这意味着在网络加班的情况下,开发者可以使用相同的订单id进行重新测试和扣除,直到他们回到明确的响应。
以下是简单的时序图,一些角色对开发者不需要关心的部分进行了简化:
性能
小游戏中常见的性能问题通常是由内存引起的。如果内存占用过多,将被微信客户主动关闭。因此,开发者应在用户游戏过程中及时释放不再使用的内存(js代码删除引用,或主动调用相应资源的释放接口,如有),特别是canvas和image等大型对象,并可主动调用wx.triggerGC触发底层回收对应资源。
对于与游戏逻辑相对独立的工作,可以考虑在worker中实现,小游戏提供了独立的worker线程执行js逻辑的能力。
版本更新机制
小游戏的启动过程分为冷启动和热启动。冷启动是指在内存中没有小游戏运行实例的情况下启动小游戏的过程;热启动是指小游戏的运行实例仍然存在于内存中,但暂时切换到后台,然后用户再次触发小游戏回到前台的过程。
小游戏会在冷启动时检查小游戏的版本。如果有新版本,最新版本可以在下一次冷启动后下载回本地。当然,我们也提供了API,让开发者在有版本可用时决定是否需要强制更新。
运维
特别提醒,小游戏有一个完美的后端监控,可以通过“操作和维护中心”打开,如脚本错误监控。脚本错误主要由操作过程中未捕获的异常触发,需要关注。这种异常可能会导致用户小游戏前端的js逻辑暂停执行。
该平台还提供完善的数据分析服务,可通过“小游戏数据助手”进行数据分析。