其实,我们一直都在马不停蹄的开发《戴森球计划》,工作实在太多,时间又实在太少了,每天都感觉被时间追着跑,一刻都不敢耽误,还有一大堆内容没做完。唉,此刻又陷入深深的焦虑中。
《戴森球计划》从题材上来说,是一款模拟经营游戏,那模拟的是什么,经营的又是什么呢。在解释这个之前,我先和大家说说戴森球。戴森球,是弗里曼·戴森在 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); //原理是将树叶的顶点法线指向整个树的外侧
感谢我们的牛仔先生!
(虽然他只是来我们游戏里打酱油的~)
厉害,想知道有液体海洋的星球是否会根据算法生成河流
@多吃就会胖一点:我们现在正在尝试生成河流,不过要在1s内完成一整个星球的数据生成还是一个很大的挑战呢,因为游戏设定必须要做到无缝加载~
COOOOOOOOOOOOOOOOL!
牛批
好厉害啊!这难道就是传说的大牛吗……
我的和你的很像,但你们的美术比我好太多了。。。跪了。。。 T T
球面星球牛逼
太牛逼了,请问开发到什么进度了,游戏里可以造戴森球吗
蛮期待这个,大佬能不能放一点开发进度看看啊0.0
非常期待,希望能加入你们的测试.
玩了快100个小时啦,每天下班回家第一件事就是打开戴森球想想怎么改进我的流水线哈哈哈,过年的每天都期待你们的更新消息,上班摸鱼来读你们的开发日志,感觉你们真的很用心耶,敬佩你们!哈哈,牛仔先生真的可爱,希望牛仔先生可以成为伊卡洛斯的驾驶员或者是出个牛仔先生的皮肤.加油喔!