2015年4月3日

激光、能量盾、行星–打磨您的科幻武器库

作者 Vasiliy Tedeev

Snowforged Entertainment 成立于西伯利亚市郊的一个小山洞中。这个小团队由一群灰熊和一个人类组成,目前正在制作Starfall Tactics –这是一个实时的战争游戏,让您可以组建自己的宇宙飞船舰队,您可以自定义每一艘战舰并通过与富有经验的对手的战斗来测试您的创意。

作为PC游戏的狂热爱好者,很久以来,我们的团队都心怀创建硬派和非传统游戏的梦想。我们不会让技术限制阻挡我们前进的步伐。虚幻引擎4让我们的项目可以马上就开始制作,这使得我们的工作变得比以前容易得多。

本文中,我们会讨论一下,如何让您科幻武器库的一些基本工具产生应有的效果。请注意,下方的概述内容是关于我们的团队如何处理这些问题的。如果您有其它方案,请在下方回复评论,我们非常愿意听到您的声音!

"永远看着光亮处…除非您拿着激光指向仪。 无名作家

在科幻历史中,激光似乎是最为有效的武器之一。我们很难想象在一部您最喜爱的科幻电影的标志性战斗场景中,会没有太空中发射的炫目的激光光束。

所以在Starfall中,我们的团队想要确认激光武器不仅看起来威武雄壮,而且能够为太空战添加一种视觉上的美感。然而和最初的想法相比,这个任务并不那么容易实现。

SF_1

我们的程序员选择了Beam Particle System(光柱粒子系统)作为解决方案。Starfall中的每把枪都是具有Particle System Component(粒子系统组件)的Actor。当发射激光束时,这个系统会追溯射击到目标的光束,从而决定冲击点,并将其作为光束击中目标的粒子系统中的参数来传递。然后Particle System Component(粒子系统组件)会激活,并将光束指向其目标。

但是我们面临两个问题:

实时光显示

当两艘测试飞船开始互相射击激光束时,光束看起来是实时的,而且发射的轨迹根本不清楚。我们尝试了不同的解决方案。我们不满足于锥形的光束。

所以我们的程序员为光束的传播添加了一个有限速度值(请查看粒子系统的光束类型数据模块的速度参数)。但难度在于如何让这个值足够高,从而通过充足的FPS来让激光束的发射能够很好地在多帧间散布。最后我们终于完成了正确的效果- 光束看起来是实时的,但您仍可以很方便地看到它的发射方向。

SF_2

巨型光束

如果您让一束激光束足够宽,从而在远距离也能清楚地看见,那么当您放大看这束光束时,您会发现它看起来比中国的长城还要大。想象一下一艘太空船发射比自己船体还粗的激光束吧。很奇怪,不是吗?

但是,如果我们制作”真实“大小的激光束,这会导致飞船间互相发射的是看起来小小的、窄窄的光条。任何人看到这样的效果,都不会认为很酷!

一开始,我们尝试通过修改粒子系统中的LOD(细节层次)设置来解决这个问题。很遗憾,在不同细节层次关卡间的转换是很明显就能观察到的 - 光束几乎是即时变更了厚度和大小。

在经过一番修补(和吼叫)之后,我们通过使用光束的材质来解决了这个问题:

SF_3

光束的厚度会根据相机的高度在一定平面来持续进行变更。任务完成了!

SF_4

由超级浓缩的果冻所组成的隐形墙将成为阻挡子弹和嘲讽的良好护盾。”  Jarod Kintz 

科幻中所说的能量盾相当于奇幻小说中的剑与魔法。您在各种媒体上都能看到 - 游戏,书,电影和电视剧。但是这并不意味这个能量盾在各个媒体中都是统一的。一些能量盾 "附着于“某个物体的表面,而另一些会有一个保护性的”球“来围绕母体。还有一些能量盾可以吸收所有射击的射弹,而另一些则会将其反弹给攻击者。

要说起游戏体验和机制来,所有这些都有各自的长短处。对Starfall Tactics这款游戏来说,我们使用的是经典的围绕宇宙飞船的隐形"球"盾。这个能量盾会在吸收射入的射弹时实时闪光,这样玩家就知道自己被击中了。

SF_6

一开始,我们决定制作一个围绕着船体的能量盾网格物体。但是后来我们发现,如果在每个船体上都拖曳一个额外的网格物体,再启用碰撞,这个方法不是特别好。我们在第二次尝试时,程序员把网格物体的能量盾替换成了胶囊体组件。这样我们达成了相同的目标,但大大降低了碰撞所造成的性能消耗。

为了表示能量盾在被射中后产生的闪光效果,在碰撞点处会生成一个Actor。这个Actor包含了半球体样式的静态网格物体,使用了描绘护盾效果的材质。这个半球会根据法线到胶囊体表面的距离和船体的大小来延展,而且会在受到射击的瞬间进行延展:

float Yscale = FMath::Abs(FVector::DotProduct(DamageEvent.HitInfo.Normal.SafeNormal(), this->GetOwner()->GetActorRotation().Vector().SafeNormal()));

Yscale = FMath::Lerp(this->CapsuleRadius * 2, this->CapsuleHalfHeight * 2, 1.0f - Yscale);

ShieldEffect(DamageEvent.HitInfo.Location, DamageEvent.HitInfo.Normal.Rotation(), FVector(this->CapsuleRadius, Yscale, this->CapsuleRadius));

这样,玩家就有一种清晰的感觉,能量盾”附着“于船体。这个效果很好,我们的团队正期望在未来使用其它类型的护盾!

SF_7

行星宛如遇难者的头颅。 Visar Zhiti 

 

啊,行星啊 - 你就是太空中的宝石呀!

我们三维美术师的目标是在整个表面创建具有北极光的行星。我们所生活的地球看起来是笼罩在一种美丽的、神秘的绿光中。这是由于太阳风(包含充电粒子)撞击地球的大气层所产生的效果。

SF_8

我们决定通过材质来达成这种效果。这个设置相对简单: 使用具有标准贴图和绿色光晕的行星。光晕的图像是圆周外圈平均分布的大量线条的集合,我们把它和特殊的不透明蒙板共同使用。

尽管我们尽了最大努力,但是行星看起来还是一个毫无生机的翠绿色的球体。我们没法使用静态对象来表现出北极光那种宏伟的闪光。这种光照总是在移动,而且会像一条大大的、友善的阿米巴虫那样移动。

我们的解决方案是使用余弦函数来让光晕缓慢旋转并缩放动画。为了增加体积-我们使用了具有光照的三个平面,而非一个平面,并把它们以略为不同的角度进行放置。

这样我们就接近成功了! 为了防止来自于光晕的大量光波同步移动(这看起来不自然),我们添加了由行星蓝图的随机值所确定的新参数。

SF_9

通过使用材质,我们设置了行星的常量旋转速度并通过菲涅耳值来添加了更多体积。我们的三维美术师可能认为这个体积近似于爆炸 - 爆炸让一切看起来都更好了。

SF_10

到了快要完成的时候了! 这个行星具有了能优美地照亮其表面较为灰暗区域的大气层。这是通过复制行星的网格物体,并将其略微扩大并应用不同的材质来完成的。

为了添加更多发光,我们使用基础颜色以及可靠的原有菲涅耳值,从而确保只有边缘会发光,而不会让行星本身的视图变得模糊。最后就是通过法线贴图来对行星表面添加凹凸和坑了。

SF_11

行星终于完成了!

SF_12

注意: 当您在动画中查看它时,您会发现它看起来更棒:)

不存在故事真正结束的时候。但您会在某处结束故事。 Frank Herbert 

我们期望对于本文中我们的团队所进行的工作,能够让您获得对任何科幻游戏的基础要素创建和调整的灵感。Starfall Tactics正缓慢从我们脑海中的碎片转化成现实。这款游戏当前正处于高级原型阶段,我们盼望能够随着开发进度而与您共享更多信息。

如需了解并关注游戏的开发进度,请您访问starfalltactics.com

完毕!