独立3D网络游戏《战域重甲》开发与上架经验分享

小编阿麟:
心之所向便是光,我们都是追光者!
这位独立游戏开发者的产品能力已经不输给许多小团队,希望他的故事和经验分享,可以给走在同样道路上的朋友一些信心和帮助。

背景介绍

2023年年底的时候,我突然有一个很强的意愿,就是把自己的游戏《局部战争》迁移到微信小游戏。

游戏地址:https://localwar.xidayun.com

5de3cba30b67ccf3871749eb0832fff0.jpeg

《局部战争》是我早些年使用 WebGL 引擎开发的联机游戏。起初,我尝试过自己编写Adapter的方式来实现微信小游戏的适配。

但这部分工作量大的远远超出我的想象,最终这个想法没有实现。这使我不得不考虑使用原生就支持微信小游戏的游戏引擎。在多次调研后选择了 Cocos Creator。

既然都要重头写了,为什么不重新写一个新游戏呢?结合自己对物理引擎的偏爱,于是有了编写一个多人坦克大战游戏的想法。我将游戏命名的任务丢给了 GPT,并在 GPT 给出的列表中选择了《战域重甲》这个名字。

今年(2024)7月10日,这个游戏已经上架到微信小游戏,可以微信搜索【战域重甲】或扫描小程序码体验。2b35d7f3b8ad7d042a2458cdbdf6b4e9.jpeg

接下来给大家分享一些这款游戏开发中的技术点和上架经验。

游戏特色

《战域重甲》是一个3V3多人战斗载具模拟驾驶游戏,游戏地图包含一个1200x1200米的战斗训练场,并提供 4 种不同的战斗载具供玩家选择,包含主战坦克、装甲突击车、火箭弹发射车、武装直升机等。游戏具有真实的物理交互和驾驶体验,游戏支持多端跨平台体验,包含网页PC端、移动端H5、微信、抖音小游戏端等平台。

63957b795ffcbf0f011207e0fac6f5a6.jpeg

物理引擎的应用和联网同步方案

1.阉割版的帧同步

帧同步有一个天然优势就是服务器压力小,因为服务器只需要广播玩家操作行为,而不需要处理复杂的运算逻辑,但因为我在游戏中使用了物理引擎,这个是一个非确定性物理引擎,所以它没有办法使用帧同步方案中的预测和回滚,于是我在开发的过程中删除了预测和回滚部分。

选择帧同步的另外一个原因是,帧同步大量的运算都在本地,对玩家直接的物理碰撞能够实时反馈。比如在联机状态下,玩家可以撞击其他玩家的载具。这种机制可以增加一定趣味性,效果如下图:

e670803106783868553a4c5d2d8b0e7b.jpeg

2.消除非确定性物理引擎的不一致性

先解释一下什么是非确定性的物理引擎,下图的两个物理结果,是在相同条件下运行的物理效果。我们可以发现如果不进行任何约束,物理引擎在多端、甚至同端下都表现出来不一致性或者说是混沌性。(如下图)

cf10dedac1c0179ad6bc97ca5f34e6df.png为了解决这个问题,我在帧同步的数据中塞入了载具角度数据(worldRotation)和位置数据(worldPosition),并在客户端和服务器的数据中对这两个数据进行对比:

1.误差较大: 当其他用户提交给服务的数据和当前用户本地数据有较大的误差时,我会通过物理引擎的setWorldTransform方法将其强制校准为服务器的位置;

2.误差较小:不做处理;

这样既可以保留物理效果,也可以让载具的位置和角度在多端保持一致。相当于给其他玩家的载具栓了一个绳子,超过一定范围就把他拉过来。

这种情况下,这里的worldRotationworldPosition实际上属于状态数据。也就是状态同步。《战域重甲》就是就是采用两个方案串用的方式解决了物理引擎多端不一致的问题。

3.具有实体弹药和飞行轨迹的设计;

《战域重甲》游戏中,载具的发射出的飞弹、火箭弹都是有实体的,这和传统的射击游戏有所区分,在本作中,玩家需要考虑自己载具弹药的出膛速度和下坠速度,结合地方目标的移动速度,设置提前量进行打击。(如图所示)

f08260cfe25031121c2998952bea424b.jpeg

7389b73a71104f010bb8068a0cf2fb8c.jpeg其实,实现的方案很简单,创建一个飞弹的模型,让模型按照瞄准的方位进行高速移动,给飞弹的模型中塞入一个射线检测,每帧根据飞弹位置和角度一直创建新的射线检测。当有障碍物被射线检测到,则判断为命中或者坠毁。

服务器配置和扩容方案

1.后端技术选型

后端服务基于nodejshttp服务框架使用的是express,战斗服务器使用的是colyseus.io,使用redis进行进程和集群内的通讯,使用mongodb进行持久化数据的增删改查。

2.集群、多进程和负载均衡;

http负载均衡:使用主服务器的nginx平均分配多个集群、进程的请求频次。

socket负载均衡:每个服务进程使用pm2启动,并通过nginx为每个进程绑定独立域名。将独立域名暴露给colyseus的负载均衡器WebSocketTransport,由负载均衡器在创建房间分配对应的进程,并在其他用户加入放假时返回对应房间的socket地址;

横向扩容:通过增加机器数量,将更多的进程url地址暴露给WebSocketTransport即可实现横向扩容,理论扩容体量没有上限。

服务器部署和配置结构69ca887fe90f1d32e05f28425e71347e.jpeg进程池内部端口
使用pm2启动43d708cad49db68b278f9fed8ff27283.jpeg

一些采坑的建议

1.提前规划物理引擎的分组和掩码。

简单解释一下什么是分组和掩码,这个有点像沙子和筛子。它的配置项确定了哪些物体和哪些物体会发生碰撞,射线会命中那些物体,而忽略那些物体。(如图)

103c6fb0a5aff4c441fa1e1d79aadefd.gif提前规划这些内容,不仅有助于我们对物理引擎性能调优,还能帮我们避免一些奇怪的效果,比如子弹老是击中玩家自己、坦克的炮弹把自己带飞了出去、角色被创造物挤的卡进墙里。想要解决这些问题,就得提前规划物理引擎的物体对象的分组和掩码。因为后期随着物理对象数量的增加,规划难度也将增大。

参考cocos官方文档分组和掩码

2.提前准备微信审核材料和软著内容

【重要、重要、重要!!!】:以下几项内容建议专门安排3个工作日的工期认真的准备一下材料,并按照要求仔细核对清楚,不要嫌麻烦,一直被打回更耽误时间!有人可能会告诉你随便填一填就好,审核员不看,那都是骗鬼的,你省下的几个小时,可能被打回就是耽搁几十天,这不划算。

【电子版权认证】
目前抖音和微信小游戏都支持电子版权证书,如图所示;f78add3e1b43f7e95dca23b4d0e62bf1.jpeg

该证书可在2周内即可下发,申请容易,基本包过,只是要收费,每证600元。前期可以用于过渡。

【软件著作权登记证书】
83a7bd749b0583c559402c9efd6d3ad7.jpeg

免费,且泛用性较高,我不建议找中介,几百块的那种中介只会耽误时间,他们基本就是乱写套壳,而且很容易被打回,有的一直补正补了半年了还没给你弄下来。其实只需要按照表格的要求自己填写内容,内容尽可能的详细完善,自己申请就很容易通过。全程电子化,不需要去线下办理,只是软著普遍等待时间比较漫长,一般需要2个月左右才能下证。如果比较急可以和电子版权认证一起申请,先解决微信和抖音的上架问题再说。
这里面最容易被打回的内容就是文档鉴别材料,就是《xx软件操作说明书》如果功能没做好就不要列上去,软件截图的每个功能最好都能写一下使用说明。软件title中包含“游戏软件”的,文档鉴别材料需要文图结合介绍游戏从开始到结束的全流程,包括游戏健康忠告、游戏主界面(带游戏名称)、适龄提示、所有角色形象、所有可进入的场景、可体验的全部系统、主要特点、游戏方法等,所有截图应清晰完整。 如果你的项目不包含上述内容,则需要在文档鉴别材料中说明,比如:“游戏主要功能是拼图,游戏内不含虚拟角色形象”

【微信和抖音的内容审核和icp备案】
游戏内容审核和小程序备案除了平台审核,还需要主管部门审核;
游戏内容审核一般要40天左右,所以一定要提前准备材料,在游戏开发过程中就可以发起审核。避免耽误时间。
抖音和微信小程序备案一般3天左右就可以完成审核,但必须等待游戏内容审核完成才可以发起。
微信的游戏内容审核类似于软著,要求填写介绍游戏从开始到结束的全流程,包括游戏健康忠告、游戏主界面(带游戏名称)、适龄提示、所有角色形象、所有可进入的场景、可体验的全部系统、主要特点、游戏方法等,注意,所有项目截图不能重复!
抖音的游戏内容审核内容相对简单的多,只需要提供游戏基本介绍和3张截图(一定要包含游戏名、适龄提示、健康忠告)但审核时间同样都要40天左右。

写在最后

我是一名独立游戏开发者,本职工作只会用到 vue、react 这类 web 前端技术栈。在 2023 年底才入坑 Cocos,对于一个入坑 7 个月的新手开发者来说,这是一个全程都在采坑的开发过程,但 Cocos Creator 的易用性和便捷性让我克服了重重困难,项目顺利上线。

于是我将我的开发过程简单整理了一下,希望这些经历可以帮助到一些和我一样有游戏梦想的独立游戏开发者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/51702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件工程师笔面试真题汇总

目录 1、电阻 1)上拉电阻的作用 2)PTC热敏电阻作为电源电路保险丝的工作原理 2、电容 1)电容的特性 2) 电容的特性曲线 3) 1uf的电容通常来滤除什么频率的信号 3、电感 4、二极管 1)二极管特性 2)二极管伏安…

HVV | .NET 攻防工具库,值得您拥有!

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

《破解验证码:用Requests和Selenium实现模拟登录的终极指南》

两种模拟登录方式(图形验证码) 超级鹰 打码平台,用于识别验证码 requests模拟登录 from chaojiying import Chaojiying_Client import requests from requests import Session from lxml import etree #获取图片信息 def get_pic_info(img_name):chaojiying Ch…

10个append()函数在Python程序开发中的创新应用

文末赠免费精品编程资料~~ 在Python编程的世界里,append()函数是列表操作中最常见的方法之一。它允许我们在列表的末尾添加一个元素,这一简单的功能却能激发无限的创造力。今天,我们将探讨append()函数在Python程序开发中的10种创新应用&…

代码随想录第23天|回溯

39.组合总和 题目链接/文章讲解: 代码随想录 视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩_bilibili 第一想法: 组合总和与第22天组合总…

爬虫实战-掌上高考网实战

1.确定需求:爬取什么数据爬取大学名称 2.找到数据源地址数据在哪个链接中https://api.zjzw.cn/web/api/?keyword&page1&province_id&ranktype&request_type1&size20&top_school_id[3703,2461,659,3117,597,1724]&type&uriapidata/…

2024电赛H题参考方案——自动行使小车

目录 一、题目要求 二、参考资源获取 三、参考方案 1、环境搭建及工程移植 2、移植MPU6050模块 3、移植TB6612电机驱动模块 其他模块根据需要移植 总结 一、题目要求 小编自认为:此次H题属于控制类题目,相较于往年较为简单,功能也算单一&…

【Java】韩顺平Java学习笔记 第19章 IO流

文章目录 文件概述常用的文件操作创建文件获取文件信息目录的操作和文件删除流的分类各抽象类常用子类对象FileInputStreamFileOutputStreamFileReaderFileWriter 节点流和处理流概念BufferedReaderBufferedWriterBufferedInputStream & BufferedOutputStream 对象流&#…

Python | TypeError: ‘module’ object is not callable

Python | TypeError: ‘module’ object is not callable 在Python编程中,遇到“TypeError: ‘module’ object is not callable”这类错误通常表明你尝试像函数一样调用了一个模块。这种错误通常是由于导入模块时的疏忽或误解导致的。本文将深入探讨此错误的根源&…

2024年7月23日~2024年7月29日周报

目录 一、前言 二、完成情况 2.1 一种具有边缘增强特点的医学图像分割网络 2.2 融合边缘增强注意力机制和 U-Net 网络的医学图像分割 2.3 遇到的困难 三、下周计划 一、前言 上周参加了一些师兄师姐的论文讨论会议,并完成了初稿。 本周继续修改论文&#xff0…

使用eclipse在新建的java项目中编辑xml文件时Unhandled event loop exception No more handles

处理方法:更换xml编辑器 Window ——》Preferences ——》General ——》Editors ——》File Associations 如果File types里面没有*.xml,则点击Add进行新增 选中*.xml,然后在Associated editors 选中想用的编辑器,设置为defaul…

小白也能读懂的ConvLSTM!(开源pytorch代码)

ConvLSTM 1. 算法简介与应用场景2. 算法原理2.1 LSTM基础2.2 ConvLSTM原理2.2.1 ConvLSTM的结构2.2.2 卷积操作的优点 2.3 LSTM与ConvLSTM的对比分析2.4 ConvLSTM的应用 3. PyTorch代码参考文献 仅需要网络源码的可以直接跳到末尾即可 1. 算法简介与应用场景 ConvLSTM&#x…

SAPUI5基础知识22 - 图标(Icons)

1. 背景 SAPUI5 提供了一套丰富的图标库,可以用于增强应用程序的视觉吸引力和用户体验。这些图标是矢量图形,可以在任何分辨率下保持清晰,并且可以自定义颜色和大小。 2. 示例 在 SAPUI5 中,图标可以通过 sap.ui.core.Icon 控件…

Redis快速入门基础

Redis入门 Redis是一个基于内存的 key-value 结构数据库。mysql是二维表的接口数据库 优点: 基于内存存储,读写性能高 适合存储热点数据(热点商品、资讯、新闻) 企业应用广泛 官网:https://redis.io 中文网:https://www.redis.net.cn/ Redis下载与…

The Llama 3 Herd of Models 第6部分推理部分全文

第1,2,3部分 介绍,概览和预训练 第4部分 后训练 第5部分 结果 6 Inference 推理 我们研究了两种主要技术来提高Llama 3405b模型的推理效率:(1)管道并行化和(2)FP8量化。我们已经公开发布了FP8量化的实现。 6.1 Pipeline Parallelism 管道并行 当使用BF16数字表示模型参数时…

家具购物小程序的设计

管理员账户功能包括:系统首页,个人中心,用户管理,家具分类管理,家具新品管理,订单管理,系统管理 微信端账号功能包括:系统首页,家具新品,家具公告&#xff0…

Linux网络——深入理解传入层协议TCP

目录 一、前导知识 1.1 TCP协议段格式 1.2 TCP全双工本质 二、三次握手 2.1 标记位 2.2 三次握手 2.3 捎带应答 2.4 标记位 RST 三、四次挥手 3.1 标记位 FIN 四、确认应答(ACK)机制 五、超时重传机制 六 TCP 流量控制 6.1 16位窗口大小 6.2 标记位 PSH 6.3 标记…

YOLOv5改进 | 卷积模块 | 无卷积步长用于低分辨率图像和小物体的新 CNN 模块SPD-Conv

秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录: 《YOLOv5入门 改…

[ WARN:0@0.014] global loadsave.cpp:248 cv::findDecoder imread_

[ WARN:00.014] global loadsave.cpp:248 cv::findDecoder imread_ 目录 [ WARN:00.014] global loadsave.cpp:248 cv::findDecoder imread_ 【常见模块错误】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰…

20240729 每日AI必读资讯

Meta科学家最新采访,揭秘Llama 3.1是如何炼成的 - Llama 3.1都使用了哪些数据?其中有多少合成数据?为什么不使用MoE架构?后训练与RLHF流程是如何进行的?模型评估是如何进行的? - 受访者Thomas Scialom现任…