Cocos3D《病毒传播模拟器》游戏版本1 开发日志和总结

【本文参与征文活动】

概述

本日志对应了个人试验作品《病毒传播模拟器》游戏第1个版本,在B站、博客园硬饭都发布过,作为署名均为Nowpaper原创,由于篇幅比较长,为了方便您的阅读,您可以在下面文本框的中得到本文最终内容:

源代码和测试地址在这里:
GitHub:
https://github.com/Nowpaper/VirusSimulator
Web版测试地址:
https://nowpaper.github.io/VirusSimulator/

目录

  • 日志一
  • 起点
  • 设计灵感
  • 核心规则
  • 场所(空间)
  • 日志二
  • 世界初期设计
  • 基础数值规划
  • 模拟世界构建
  • 日志三
  • 病毒
  • 画面
  • UI和渲染
  • AI优化
  • 成果展示

正文如下



起点


就在前些日子,北京迎来了新的疫情升级,楼下社区大门全部紧闭,进出严格检查,但是北京的大街上仍然人头窜动,要知道首都北京是中国人口集中和流动最密集的城市之一,如果感染性强、潜伏期长的病毒爆发,后果不堪设想。


(图片来自北京本地宝公众号)

在新型冠状病毒刚刚爆发的时候,大概是2020年2月份,我曾想过做一个对病毒传播模拟程序,以游戏的形式对病毒传播过程做出直观展示,后来一方面感觉这项工程的庞大,如果要真实还真不太容易,我做了大量的研究和笔记,发现工作量惊人,那时候也没什么心思弄,另外一方面有其他的开发者,已经实现了类似的模拟程序,虽然功能很少,但是用来警示隔离措施的重要性已经很很不错。

从2020年6月13日得知北京新发地的确诊新闻后,就打算启动开发,以完成之前的遗憾,引擎使用上,采用了CocosCreator 3D 1.1.0 版本,原因是想让更多的人方便的参与模拟器的测试,使用H5方便传播的特点,使得CocosCreator成为了最好的选择,只需要在Github上建立一个页面就行,完全不用考虑被平台所限制。

设计灵感


首先是系统设计问题,灵感来源于个体互动,人类是社群化的生物,必然产生个体之间的交互,多个个体组合成为一个团体,比如家庭、队伍、社区,乃至城市、国家,而他们都处于一个特定的场所,随着个体和个体接触,那么病毒是否也可以借此机会传染扩散呢?

核心规则


整个系统虽说是比较复杂,但是核心规则非常非常简单,一共就三条:

1、有宿主的病毒会定时向所在场所复制自己,复制的病毒在存活期内,会尝试入侵附近的其他健康宿主

2、宿主会处在在一个场所中,宿主会依据随机意愿和世界活跃度,离开场所前往其他场所一段时间后返回

3、场所视为一个封闭空间,病毒和宿主一直处于一个场所中,世界等同于大场所,场所下面可以拥有子场所

创建一个模拟工具,考虑到其不可能完全模拟真实情况,因此简化分析和处理传播中的最常见的载体流动造成的传播问题,设计游戏模拟器的分析图,首先确定病毒的基础规则,传播规则、自身存活、数值对抗三大核心规则。

考虑载体是多种多样的,首先分为生物体和非生物体,但是经过简单的分解后,发现如果多种载体全部实现,比较复杂,且数据量较大,因此还是围绕着病毒传播主要载体人来作第一个基础载体程序, 转变思路将传播方式是散播到场所中,而人处于各种各样的场所里,比如家庭、社区、公共场合等,人一旦成为病毒载体,那么病毒将会定时向外散播病毒,让它的复制体留在场所里,这样去除了空气传播的计算问题,只需要考虑让病毒存活一段时间,在此时间中,可能有其他载体经过而被入侵,由于人所处于的场所有大小,所以活动的范围先对固定,因此这种设计也能模拟载体在一个比较固定的场所里,被感染的机率加大。

我考虑场所设计为相对封闭,它等同于一个空间,在这个空间中的病毒不会传播出去到其他的场所,只会入侵载体,而载体可以离开场所,这样病毒就会有机会向外散播。

场所的设计可以添加处理逻辑脚本,从而模拟各种各样的设施,比如人流较大的聚集地、能够消灭或抑制病毒的医疗环境等等,为了方便说明,从这个图中能看到大概的解释,就是世界里存在着场所,而人除了在世界中,它也存在于各种场所里,同样场所内也有可能有自己的场所,这样的做法就是尽可能的模拟独立空间带来的隔离传播的功能。

大概用了一整天的时间构思规则设计,然后边开发边做规则调整,确实非常的庞大和烧脑。



世界初期设计


在游戏一开始要设定基础的模拟属性,可以编辑的内容比较多,但是一旦开始之后直到结束,它们理论上都不能随意更改,而有一些数值可以进行操控,比如时间速度、病毒数据(认为它进化了)、载体活动频率、相应时间和普遍抗体等,这种操控可以有效的模拟管理政策对模拟世界的反应。


很显然在最早期完成这个设计有复杂,如果全部做到UI上,可能会花费大量的时间和精力,且在这个阶段,我感觉更多的是臆想,并没有实际和最终模拟器形态一致,因此放弃了直接从UI开始。

模拟世界构建


在最开始的开发首先没有从病毒开始,而是从基本的载体开始,并且创建了一个基本的场所,家庭,家庭在创建的时候,会生成成员,其中至少1个成员,最多5个成员,而成员就是人的数据体,为了直观,先实现了一个2D的分布,使用了正态分布算法,模拟出一个简单的世界,这里面的初始家庭数量和世界范围是可以调整的,从而随时能够在程序里变更。

正态分布算法很重要,除了模拟位置信息,将来还要用它模拟人的年龄结构、健康数据等符合正态分布的数据指标,我估计它可能会用得比较多,所以做成一个公共数据处理方法可以随时在代码的任何地方方便进行使用。

模拟器中每个白色光点都是一个被模拟的宿主(人),考虑渲染压力的情况下,将光点以Billboard(公告板)技术实现,这样整体的面片渲染能够很好的控制,在最开始我觉得可能2D模拟世界就可以了,但是稍微改了一下,结果发现3D效果更好,于是干脆直接实现3D的世界,它看起来非常的帅,好看归好看,不过确实比较浪费性能,我现在使用的模拟光点如果提高了5000个,全部通过计算面向摄像机的话,还真的是卡的要命。

先暂时模拟比较小的范围数据吧,降低到100个家庭空间,然后花费了一些时间,实现一个访问移动AI,这样它会依据AI进行特定的移动,现在看到这个效果就是在它自己本空间内的随机移动,AI会依据世界的活跃度,而产生一个外出访问,目的地是随机的一个空间,到达目的的一段时间后返回到自己所属的空间中,翻译成人话就是:AI一段时间就会想出去一趟,它到达目的地后玩开心了就返回家中。

现在有了和移动有关的基础AI,我计划让访问控制从整个模拟器世界上进行管理,所以需要实现对应的空间坐标更改,以及构建整体的世界管理类,让它有个统一的世界数据管理,这样也方便作整体的调整和数据统计,先后实现了访问行动AI和世界管理器,通过一个比率参数动态调整整个模拟器中,所有人的出行比率,现在看起来已经有了一些规模性的动态,感觉效果还可以。



病毒


在作病毒的功能要考虑周全,毕竟病毒的能力是整个模拟器的核心关键,刚刚开始准备以面向对象的方式处理,结果发现cocos3d的脚本对于继承的解析不如之前的版本方便,因此将各个功能给做了拆分,做成不同的组件方式,这样的话可以有效的分别控制,除了基本组件,还有传播组件、传染组件等,为了构建足够真实的情况,我还专门查了一下有关数据,定义了基础数值,复制间隔,感染距离,感染概率,病毒的活性,攻击力,存活时间等,这块的开发比较浪费时间,其中设计和修改模型的时间用的最长,虽然这只是一个简单的模拟,已经感觉数据关联很复杂了,为了不出bug,需要大量的时间的排查和思考逻辑,大约3个小时没有运行代码,全部都是在纸面上和脑子里运转。

画面


在画面表现上,我用了小绿色的点来代表病毒,如果病毒入侵了人体,则小绿点显示在载体身上,在设定的每10分钟进行传染的效果下,很快就将程序卡爆了,主要是因为由于复制的病毒暴露在空间时候,存活时间设定为24小时,在仅仅设定了10个家庭模拟数据下,很快就生成了上万条数据,它占用了大量的资源,所以为了更好的模拟,我将病毒的存活时间设定为游戏中的6秒,就是现实中的1小时。

看了看结果,本想可能影响比较大,结果传播效率仍然惊人,这是人们只有30%的出行率的情况下效果,我试着提高到了100个家庭,传播速度仍然是非常的吓人,也很快把我的电脑卡成了幻灯片,连正常的录制都不能实现。

UI


为了更好的直观看到数据,得把UI给显示出来,显示多少人和多少病毒的数量来看看具体的情况如何,为了方便测试,我先降低了数量级,这样可以更好的测试,等一切就绪后我将再作整体UI,经过一番折腾,UI已经完成了,感觉仍然少一些东西,暂时先把主要的数据给展示出来以方便观看直接效果。

渲染


当我再次准备开始的时候,渲染效率感觉太慢了,原因还是因为光球的贴图,虽然我用了公告板技术来优化,但是节点的生成速度是在恐怖,我稍微的降低了一下病毒产出频率,并且加了一个病毒是否显示的开关,这样才稍微好点了。

AI优化


生病,一旦生病了外出的意愿就会降低,随着健康下降,将越来越降低出行欲望,达到一半的健康时候根本就不想出去。计算公式为:

出行欲望=(最大健康值 - 健康值)/ 最大健值 - 50%

我发现一个AI bug,对外访问的时候如果空间里没有人,那么也会被选择为目标,这个很显然并不合理,将其改进了一下,每次选择访问的时候都会选择和人接触,毕竟瞎溜达也得有目的。


成果


经过几天使用CocosCreator 3D的开发,已经完成了第一个版本,我尝试对数据进行了测试,饶有兴趣的把它们做成了一个视频,有兴趣的话,请点击下面的链接,别忘记点赞投币求关注!(跪了)

B站视频链接:https://www.bilibili.com/video/BV1WK4y147N1

如果您想参与交流和参与测试,源代码和测试地址在这里:
GitHub:
https://github.com/Nowpaper/VirusSimulator
Desktop-Web版测试地址:
https://nowpaper.github.io/VirusSimulator/

欢迎与我交流,我是Nowpaper,热爱游戏行业的一爸。

9赞

有政治风险

这能有啥政治风险,您这也太敏感了

给大佬置顶

渲染效率上提个建议,给材质开启 instancing。另外,三维立体图不太符合人类行动的轨迹,可能模拟加一个地图会好一些?

路转粉 奥里给

有道理,我试试。

蛮有意思的。但是确实有政治风险,是题材比较敏感。也许会有官老爷觉得存在“负能量”

使用ECS架构去写逻辑也许会对性能有帮助

我就是看了你的视频才做了这个游戏毒来了

是 Yellow Rush的规则吧,哈哈,不错,不过那个规则确实不太适合做成电子游戏,它比较适合桌面游戏。

是的,觉的挺好玩就做了,感谢你的分享

mark 大佬奥莉给

其他城市不适合,但是重庆适合。。。

1赞

非常感谢您的帮助,我给小组发了,大家都说很好

目前来看渲染方面的性能占用比较大