物理已经成为任何现代游戏的组成部分。 无论是简单的组织模拟还是成熟的交通物理。 手机游戏也不例外。 但是,在为它们设置物理特性时,您需要回顾与受支持的较老一代设备相对较差的性能相关的限制。 领先的3D技术艺术家
Banzai.Games Roman Tersky讲述了他的团队如何将物理学整合到移动格斗游戏Shadow Fight 3的游戏玩法中,这些技术用于优化,以及他如何从头开始为角色重写物理原理,以在同步PVP中实现其完全确定性。
固态物理学

《暗影格斗3》中的角色装备具有许多受物理模拟影响的元素,这为屏幕上发生的事情增添了动感。 在为这些元素设置物理学时,我们遇到的主要困难之一是它们所附着的骨骼位于角色本人骨骼的层次结构内部。 移动时,它们会重复父骨骼的变形,并且不会受到物理上逼真的冲动。
骨骼检测器
最简单的解决方案是骨头分离。 使用脚本初始化所有设备元素之后,我们从角色骨架的层次结构中删除物理活动元素的骨骼,并使用“
角色关节”组件与父骨骼建立连接。

但是,由于fps下降而导致我们遇到一个小错误:在这种情况下,经过物理模拟的骨骼会稍有延迟地“捕捉”与关节连接的骨骼。 通常,此错误微不足道,可以忽略不计。 对于其他情况,则应用了替代解决方案。
假冲动
以掠夺者头盔为例来考虑这种解决方案,掠夺者头盔的斯巴达峰顶会经过物理模拟。 我们将梳子分成5个部分,每个部分都被剥皮到不同的骨头上。 在这些骨骼的“关节”设置中,它们设置沿所需轴的旋转限制,并设置“
扭曲限制弹簧”参数,该参数负责弹簧效果。

对于物理上逼真的模拟,将顶部骨骼从角色层次结构中取出,但是,例如在fps缩编的情况下,例如在较弱的设备上,由于“捕捉”骨骼而使网格很难拉伸。

因此,我们决定将顶峰骨骼保留在角色层次结构中,并增加其动态感,以使它们具有假的冲动。 为此,我们需要在每个动画(战斗姿势除外)中确定施加脉冲的时间及其方向。
可以读取当前动画中的帧数,然后从该值中减去15-20帧,并在接收到的差异后施加脉冲。 但是,我们设法通过将脉冲的时刻链接到
不间断的动画
间隔的结尾来避免不必要的算法。
每个动画(同样,除了战斗姿态)都有一个预先设置的时间段,在此期间,玩家无法中断它。 在这段时间之后或在接收冲击时,
不间断的间隔将结束其作用,并在此时触发我们的冲动。 所需要做的就是为多个动画配置例外。

因此,根据需要,在每个动画结束前的几帧触发脉冲。 在脉冲初始化时,我们读取骨骼在前一帧和当前帧中的坐标,并接收其运动矢量。 在此轴上施加了我们的冲动。
设备项目
为了进行优化,在对字符设备的各种元素进行物理模拟时,我们尝试使用尽可能少的对撞机。 在大多数情况下,我们可以通过仅对要执行模拟的骨骼的“关节”设置中的轴上的约束进行操作来做到这一点。


在某些情况下(例如,使用金属板),对撞机的使用是不可避免的。 但是,主要的负担不是撞机的存在,而是撞机的计算。 在“
项目设置”中微调“
层碰撞矩阵 ”有助于最大程度地减少此负载。 对于此类元素,我们使用仅在彼此之间发生碰撞的两个单独的层,从而避免了与其他层(武器,地板,墙壁等)的碰撞体的碰撞计算错误。

物理克隆
暗影格斗3有几种类型的武器,可以在攻击动画之外使用物理模拟。 目前,这是一把链子上的刀,kusrigama,双节棍和连fl。 由于上述原因,我们决定从攻击动画之外的角色层次结构中删除武器的骨骼,并在不需要物理模拟时将其返回。 通过根据情况操纵骨骼的
刚体组件中的
“运动学”参数,我们可以为它们打开和关闭物理学。
但是,当在链上使用Kusarigama和一把刀时,我们在较弱的设备上遇到了增加的负载,并且帧速下降。 当骨骼返回到角色的层次结构并为其进行物理模拟时,问题就出现了。 这是由于以下事实:即使
“运动学参数”(
Is Kinematic)参数处于活动状态,更改骨骼层次结构中的父骨骼变换也会对每个具有
刚体组件的子骨骼的物理引擎施加压力。 层次结构越长,负载就越大。

解决方案是创建一个物理克隆。 考虑一个链上的刀的例子。
在战斗加载期间,为他初始化了2块骨架:位于角色等级内部的主要骨架和他的物理克隆。 主骨架的骨骼中没有
刚体组件;只有动画轨迹会影响其变换。 第二个骨骼具有已调整的连接(关节)和活动参数为Kinematic的刚体组件。
虽然主骨骼的骨骼变形会受到动画轨迹的影响,例如在命中期间,但物理克隆骨骼的
刚体组件中的
“运动学”参数仍处于活动状态。 骨骼不会变形,也不会进行物理模拟。 在动画的最后一帧期间,两个骨骼的骨骼变换被同步。 物理克隆读取主骨架骨骼的位置和旋转,并设置其完全相同的参数。 然后取消激活“运动学”,并模拟物理克隆的骨骼。 此外,直到下一个攻击动画(已经是主要骨架)的开始,每个帧都读取物理克隆的骨骼的变形,然后在物理上移动,并将这些参数设置为其骨骼。 这种方法大大降低了物理引擎的负担,并改善了弱设备的性能。

组织模拟
将组织模拟设置为移动设备性能的一部分时,主要限制是使用与碰撞器碰撞的组织。 较便宜的替代方法是微调织物基材的
表面渗透率 。 由于在我们的游戏中有很多动画和各种姿势的角色,因此编制了最“危险”的列表,并检查了所有组织是否穿透了身体的其他部分。


我们还使用组织模拟在武器和老板Shadow Mind的头部上创建了FX火焰效果。 在这些元素的
Cloth设置中,我们关闭了重力的影响,并沿Y轴设置了Acceleration值:恒定,以便火焰会向上且随机地移动以产生颤动效果。 因此,在移动时不会出现几何形状的急剧变形,我们将电阻值设置为增加(
阻尼 )。 因此,就性能火焰效果而言,我们获得了相当现实且便宜的产品。


同步PvP的确定性物理
在死亡时和某些情况下,在Shadow Fight 3中被角色击中时,将激活物理模拟。 长期以来,Unity库存固态物理学一直用于此目的。 但是,在将同步PVP引入项目时,必须放弃它以支持自己的开发。
同步PVP意味着在两个客户端上对游戏进行相同的模拟。 动画没有问题,因为所有内容都是预先计算的,而物理方面会出现某些问题。
事实是,在Unity的物理内部使用的浮点计算在不同制造商的处理器上的工作方式有所不同。 就这一点而言,在游戏过程中,角色位置的误差会累积-在一个客户端上,该角色与另一客户端上的位置不同。 如果在物理之外,可以通过根据来自一个客户端的指标定期同步位置来轻松纠正此差异,则在物理初始化时,由于位置的起始误差,两个客户端的物理模拟会有所不同。
结果,角色明显位于不同的位置和不同的位置。 在出现这种差异之后,迟早会出现一种情况,其中攻击将记录在一个客户端上,而不是在另一个客户端上。
乍看之下,最简单的解决方案是在物理模拟过程中同步角色时,将角色在一个客户端上的位置转移到另一个客户端上。 但是角色的regdoll是骨骼的长层次结构,具有大量单独的独立实体(四肢,头部),为了正确同步其位置,您需要在短时间内传输大量数据。 事实证明,该选项太“昂贵”,因此我们决定编写自己的物理方法,这是确定性的。 这样我们可以确保在任何客户端上字符的物理状态都一致,而不管计算在哪个处理器上进行。

那么,我们的regdoll是什么? 主体由节点组成,这些节点是实体点,它们没有方向,但是有位置和质量,并且在它们之间实现了可调整的刚度链接。 一组这样的节点连接到角色骨架内的每个骨骼。 这种体系结构意味着在节点中不存在内部碰撞和限制,并且外部碰撞和摩擦在节点级别实现。 当节点在空间中移动时,会考虑重力,外力和惯性。
节点之间有两种类型的连接:
刚性肋骨 (蓝色)和
弹性肌肉 (红色)。 肋骨起到骨骼的作用,迫使节点彼此相距一定距离,并防止节点沿不同方向散布。 从任何起始位置开始的肌肉都会在节点上形成一定的姿势,如果它们之间的距离大于目标值,则将它们拉在一起,如果距离较小,则将它们拉开。


看看“引擎盖下”,看看它是如何工作的。 首先,我们允许节点自由移动,然后迭代调整链接,以使它们恢复到其目标特征。 对于一次肌肉调整,必须进行两次肋骨调整。 通过使肋骨更加坚硬,我们可以确保在肌肉暴露于结节之后肋骨连接不会破裂。

结果,节点在自由运动阶段移动的能力越强,必须花费更多的计算成本来恢复肋骨和肌肉。 为了将这些成本和结构破坏的风险降至最低,我们决定将迭代过程分为几个步骤。 即,在一帧中,节点发生几次自由移动并对其进行校正。 一步,节点设法移动少得多,并且对其进行调整变得更加容易。 因此,我们认真节省了用于调整肋骨和肌肉的必要迭代次数。

一组肌肉长度确定目标姿势,角色过渡到物理模拟后,角色将从任何位置寻找目标姿势。 为了避免过于突然的过渡和结构破坏,我们添加了插值pos。 在进入物理学的那一刻,我们将角色的当前姿势作为目标,然后在五十帧中将其插值到预设的目标姿势,以实现平稳过渡。

在使用物理学时,我们遇到的主要问题是肢体(主要是手臂)的周期性扭曲。 这是由于以下事实:在过渡到物理时,角色可能处于远离目标的位置,他的肌肉收紧了该位置。 为了最小化并在将来完全避免这种情况,已采取了许多措施。 首先,我们设置了几个目标姿势,肌肉可以收紧这些姿势。 在进入物理学的那一刻,我们采用当前姿势,查看它与哪个预设目标姿势最接近,并向其收紧节点。

最初,当转向物理时,肌肉会用力推动结节,使结节达到所需的位置。 通常,这种排斥的尖锐性还导致四肢强烈扭曲的事实。 我们增加了平滑的肌肉力量,从而大大改善了这种状况。 在物理模拟开始后的前两帧期间,在对节点施加脉冲后,其肌肉强度将保持最大值以稳定节点。 然后,肌肉放松,其力量变为55%,然后在120帧内,力量逐渐增加到100%。

最后一步是增加了两个稳定节点:前部在胸部水平,后部在腿水平。 这些结节分别与胸部和骨盆的固定结节有肋骨连接,不稳定的结节因肌肉而收紧。 与其他节点不同,稳定节点的质量值较低,并且不会与地板发生碰撞。

在下面的gif中,您会看到结果:我们得到了一种基于整数计算的完全确定性的物理学,即使在我们支持的最薄弱的设备上,也可以60 fps稳定地工作。

在社交网络上关注Banzai Games: Facebook , Vkontakte , Instagram , LinkedIn
Banzai Games团队需要经验丰富的VFX专家。 在此处阅读有关空缺的更多信息。