发在春节假期的《戴森球计划》开发日志-2
阅读
2021-02-17更新
最新编辑:若可York
阅读:
更新日期:2021-02-17
最新编辑:若可York
时间:2021-02-16
最后更新时间:2021-02-17
来源:Steam
原文地址:https://store.steampowered.com/news/app/1366540/view/5405978592538174217
,请注意文章时效
嗨工程师们!
暂时脱离了主脑“桎梏”回到“现实生活”的感觉如何?莫慌,这篇不是更新日志——我们今天想为大家奉上开发日志2#作为假日读物,也希望能为各位工程师带去《戴森球计划》的船新视角。
(点这里阅读 开发日志#1)
引言
其实,我们一直都在马不停蹄的开发《戴森球计划》,工作实在太多,时间又实在太少了,每天都感觉被时间追着跑,一刻都不敢耽误,还有一大堆内容没做完。唉,此刻又陷入深深的焦虑中。
《戴森球计划》从题材上来说,是一款模拟经营游戏,那模拟的是什么,经营的又是什么呢。在解释这个之前,我先和大家说说戴森球。戴森球,是弗里曼•戴森在 1960 年就提出的一种理论,是一种太空巨构,它完全包围恒星并且获得其绝大多数或全部的能量输出。在我们设定中,就需要建造戴森球为超级计算机——“主脑”提供能量以维持强大的计算能力。
建造戴森球需要消耗大量的资源,因此 COSMO 派遣机甲探索宇宙,寻找资源,为新的戴森球建造原材料基地,但仅仅一个星球上的资源肯定是不够的,这就需要经营一个更庞大的跨星系自动化基地了。
如何实现星际间自动化?其实,在游戏的设定中,需要建立星际物流网络,把不同星球上的工厂串联成一个庞大的工业帝国。为了实现这种星系之间的连接,我们在设计和技术实现上做了很多的探讨,最终确定了方向——要想星际自动化,首先就必须要有宇宙,有了宇宙,一切设计才有了基础。
如何生成宇宙模型
在这部分开发日志里,我主要分享一下我们游戏中宇宙是如何设定的。
首先,我们需要确定的是,游戏中模拟的宇宙范围到底是多大。大家都知道,实际的宇宙无限大,如果我们以真实的宇宙范围作为参考来模拟游戏中的宇宙的话,估计游戏是做不完了,但如果把宇宙范围设定得太小的话,又会偏离最初的设计意图。那么,怎么才能让玩家既能感受到宇宙的浩瀚,又能体验到游戏的趣味性呢?这个问题苦恼了我们很久,我们知道必须在设计上做一些取舍。经过不断的讨论,最后我们秉着一切从游戏性出发,形式追随功能,将游戏中星系设定在星区这个级别。
图片来源于维基百科
要想模拟宇宙,就不可避免地要对每颗恒星的性质进行设定。我们都知道,每个星区都包含了不同种类的恒星,而每种类型的恒星都有自己的特性,这些都是要有科学依据的,不可能想当然的假设,不然就会站不住脚。因此,整个宇宙模型的推演必须要建立在恒星规律的基础之上。现在,我就和大家分享一下我们是怎么推演的。
赫罗图(Hertzsprung-Russell diagram),是丹麦天文学家赫茨普龙及美国天文学家罗素提出的,是恒星的光谱类型与光度的关系图。从赫罗图中,我们可以看到绝大多数的恒星位于从上方到右下方的对角线窄带内,这条带就是主星序,其中的恒星就是主序星,大概占恒星总数的 80%~90%。我们在恒星类型的设定时,也参考了这个比例,将大多数恒星设定为主序星,也就是大家熟悉的太阳,同时我们也设计了一些红巨星、中子星、黑洞等。
图片来源于维基百科
从游戏设计的角度来看,我们不可能把恒星的实际质量及规律真实还原,更需要考虑的是游戏性。为了设定恒星的质量,我们做了一些假定:恒星质量的对数大致呈正态分布,以 A 型恒星的质量作为正态分布的平均值,分布在左侧都是红黄色恒星,分布在右侧都是蓝紫色恒星。整个设定的实现逻辑如下图,通过这个逻辑推演便可以设定每颗恒星的质量。当然为了游戏性,在满足科学的基础上,我们在游戏中对恒星的质量做了一些修正。
在恒星特性设定过程中,我们发现恒星的特性,尤其是恒星的光度和表面温度,非常强地依赖于恒星的质量。因此,在设定恒星的一些特性时,我们基本上是以恒星的质量作为设定基础。当然,恒星的性质是相当复杂的,我们在游戏中不可能设定完所有特性,只选择了一些和游戏核心玩法相关的特性。在这里,我简单分享几个恒星性质设定的推演逻辑:
在游戏的设定中,有 O(蓝色)、B(蓝白色)、A(白色)、F(黄白色)、G(黄色)、K(橙色)、M(红色)七种不同类型的恒星,每种类型的恒星质量也各不相同,总的来说,O 型恒星质量最大,M 型恒星质量最小,而且质量大的恒星颜色比较明亮,而且温度很高,而质量小的恒星颜色比较暗淡,温度也比较低。
当然,如果只是简单的按照设定模拟每颗恒星,整个画面的色彩过渡会显得很不自然,因此就需要做一些色彩上的调整。我们根据恒星特性与质量之间的关系,在 Unity 中对恒星的颜色做了进一步的参数设置, 包括恒星主体颜色、光晕的颜色、光照颜色、日落的颜色等等。最后,我们在调色盘中调了上百种颜色,才生成出所有类型的恒星,也使恒星颜色能够合理的过渡。
在设定完恒星的特性之后,我们开始思考如何根据恒星的特性确定行星的分布。蓝色的 O 型恒星的质量很大,而且温度很高,那我们设定它的行星分布大多数是熔岩星球,而红色的 M 型恒星质量小,而且温度很低,那它的行星分布大多数则是冰冻星球。
行星类型的分布确定之后,现在我们需要考虑的是,一个星系到底生成几颗行星比较合适呢。为了增加游戏的趣味性,我们必须随机每个星系的行星数量。目前,我们设定的每个星系随机生成 1~6 颗行星,当然包含气态行星在内,同时每颗气态行星至少有一颗固态行星类的卫星,具体有多少颗卫星,就看这个星系设定的总的行星数量了。
为了确定行星的类型,我们设定每颗恒星有 16 条不同的运行轨道,而生成的行星则随机分布在不同的轨道上。每条轨道的大小不一样,而且每颗恒星适合居住的区域大小(Habitable)也不一样。行星的类型取决于所在的轨道以及是否处于 Habitable 内,如果轨道在 Habitable 里,那大概率则是海洋星球;若轨道不在 Habitable 内,那么越靠近恒星的,大概率是熔岩星球,反之越远的则大概率是冰冻星球;若都不是这几种类型的星球的话,那就大概率会是荒漠星球了。就这样,我们利用程序算法确定了不同轨道上的行星类型。
在设定完恒星及行星的特性之后,我们需要随机生成星系的形状,这样才能保证每个玩家的每一局新游戏都是不同的体验。关于星系形状的生成算法,我们选择了常用的柏林噪声算法(Perlin Noise)。柏林噪声是一个非常强大的算法,经常用于程序生成随机内容,比如地形,火焰燃烧特效 ,水和云等等。从下面的柏林噪声图中可以看到,涂色区域的恒星会比较密集,其他区域则会相对稀疏一些。
哦,差点忘了,我们还需要给每颗恒星取名字。说起取名字,真的是让我们开发组哭笑不得。我们所有恒星的名字都是用程序算法把英文字母随机排列组合,刚开始随机出来的怎么看都不像是个名字,有的还超级搞笑。后来经过不断的优化,才让恒星的名字有那么一点像样了。下面这个就是现在游戏里做好的星系图,我录了个 Gif 给大家分享一下。
我们知道,宇宙模拟模型的设定中存在很多不足的地方,在之后开发的过程中,我们会尽最大努力去完善,不管是从游戏性还是科学性,都希望能够做得更好。说到这里,发现《戴森球计划》还有好多内容啊。额,不说了,我继续摸鱼去了,下次再和大家分享~
美术资源制作:树
做了两棵树和几种石头的模型,再也不用看之前丑丑的树了。
关于树的动画,我们用了一种很神奇的方法——给树叶的每个顶点涂上不同的颜色,然后用 shader 把这些顶点颜色的 RGB 变成运动方向的 XYZ,这样树叶就能动啦~
v.vertex.xyz += (v.color.rgb - 0.5) * (sin(time + 0.65) * cos((2 + v.color.r) * time - 0.5) * cos(3 * time + 0.5) + sin(20 * time) * 0.05) * _Anim;
// 原理是利用几个正弦波的叠加模拟树叶的摆动
另外,我们利用 shader 重置了树叶的法线,使得树叶整体看起来毛茸茸的,感觉还不错哦~
float3 std = normalize(v.vertex.xyz);
v.normal.xyz = lerp(v.normal.xyz, std, _LerpNormal);
v.normal = normalize(v.normal);
//原理是将树叶的顶点法线指向整个树的外侧
感谢我们的牛仔先生!
(虽然他只是来我们游戏里打酱油的~)
【感谢阅读,我们之后会分享更多开发日志。春节假期后会给大家带来更多游戏更新,敬请期待!】