hallo,大家好,我们是独立游戏《InOutPath》的开发团队,随着游戏开发日趋完善,我们现已将《InOutPath》的Steam页面公开。
地址如下: Steam 上的 开关 InOutPath (steampowered.com)
作为一名独立游戏团队的一员,感慨良多。非常感谢cocos团队提供的优秀引擎让我们在打造这款游戏的时候不会被技术掣肘,可以随心所欲发挥创作的空间和能力。
我们是一款冒险解谜游戏,一共7个大章节300+小章节。包含了包括海洋,水面,竹林等各色的7种完全不同风格的场景,也包含了20多种迥异的解谜机制。
我们的游戏在程序实现上,需要满足创作团队海阔天空的想象力,这与cocos提供的强大的可视化编辑器能力是断不可分的。
在此我再次感谢cocos团队的卓越能力。三鞠躬。
话不多说,技术论坛上干货。
首先游戏的整个驱动是分为数据部分和显示部分。数据部分基于cocos编辑器插件进行数据构筑。这里非常感谢cocos团队 2youyou2 提供的思路。
我们基于cce.gizmos api 打造了一个较为舒服的路径规划工具。PS:cce api是cocos editor api的编辑器命名空间API。里面封装了大量对于cocos editor的操作。
API 如下:
因为路径数据和物体模型无关,这可以让我们非常方便的在美术资源未准备好的时候就进行大量的创作而不会增加后续研发成本,路径是简单数据也不会带来任何运行时损耗。
首先我们先找个小型关卡看一看。
其中路径中间的白色线段既是我们的关卡路径。他几乎承担了整个游戏的的逻辑。无论是小型地图还是超大型地图,都能一把嗦。
无论你的路径是需要旋转,缩放还是平移都可以非常方便的视线,无论你的路径是直线,曲线或者什么物理上不存在的线。
由于我们风格迥异的关卡氛围。所以我们有9个配置好的完全不同的场景数据,我们会在加载不同的风格的时候,使用场景数据同步到当前场景,因为我们在游戏运行中并不会加载其他场景。除开main场景,其他场景只是一个氛围配置表。里面包含了主方向光,雾效等各类参数。
这样我们可以在一个场景里面跑通所有风格的氛围了。
接下来就是后处理部分了,由于cocos新版的后处理框架在性能方面不满足我们的项目需求,所以我们还是继续延续了我们另一款RPG的后处理架构。
目前我们使用的后处理技术有:
同样的,我们也会在加载不同的风格的时候对后处理进行关卡控制。
这里我稍微说下我们获取深度图的方式。
由于我们不想先渲染一遍场景获取深度图,我们也不需要特定角度的深度图,比如对于下雨遮罩的顶部深度图。所以我们只需要在渲染透明物体前把深度图拷贝出来使用就行。如果你问我为什么不直接使用,需要拷贝。那是因为会出现gl的写时读问题。
关键代码如下:
其次就是全部GrabPass了,我们需要做水底部分的波动,水面部分的正常渲染。
也是一个全屏拷贝pass搞定。
就是在渲染透明物体前拷贝一遍已经渲染的结果。
然后就是发布steam需要打包桌面版了。
这里我们采用的是electron+web mobile的方式。
我们采用的steam sdk 库是 whaqzhzd/steamworks.js: A steamworks implementation for nw.js/electron games (github.com)
这个库和原库不同的地方在于我们接入了新版的steam p2p sdk。因为我们另一款多人RPG需要使用。
这里提一句electron的加密。由于web mobile的代码都是裸的。这导致如果有人用asar unpack解包的话是可以看到无代价看到全部源码的。所以我们基于rust实现了一个非常简单的加密。
由于我们知道electron是可以把node文件作为启动文件的。
所以首先就是修改启动文件为加密node文件。
然后利用electron-packager的api对源码进行加密:
加密后再rust里面对源码加载进行拦截然后进行解密。这里首先我们屏蔽了应用程序的调试。
然后就是在rust里面使用napi对node的_compile函数进行覆写。以便可以让js引擎加载已经解密的代码
解密函数就是对于前面加密函数的反向。
需要注意的是,由于cocos使用的systemjs。所以我们也需要拦截systemjs的createScript函数。
到此一个简单的加密就完成了。这个加密非常初级,只可以增加一点点的难度。但本质没有改变。
最后我放几张游戏图给大家看看。也希望大家帮帮忙点点愿望单。谢谢大家啦。
Steam 上的 开关 InOutPath (steampowered.com)
whaqzhzd/electron-asar-encrypt (github.com)