每个人,我的问题已经花费了太长时间了,我很喜欢新鲜的眼睛如果任何人有任何想法。
在我的游戏中,玩家控制着一辆车。我想建立一个美容系统,玩家可以装备美肤,反应物理学(例如,颤抖的天线,或者一顶翻飞的帽子),但不影响汽车的物理学(即,美肤不应该影响游戏)。所以如果你用颤抖的天线做例子,基本设置现在看起来像这样:
- Car: 一个动态 Rigidbody2D。有时候它通过 AddForce 来移动,有时候它通过 MovePosition,取决于上下文(剪辑和其他)。
- CosmeticBase: 一个动态 Rigidbody2D,作为绑定点。
- 天线: 构成实际美肤的各种动态 Rigidbody2D。目前也许可以想象这是一个单独的动态 GameObject,附着在 CosmeticBase 上,通过一个 SpringJoint2D。
理论上, CosmeticBase 跟随汽车,而天线附着在 CosmeticBase 上 - 所以天线跟随汽车有很好的物理表现,不会影响汽车的物理性质。
我无法将其实现,尽管如此,但是我的方法失败了。以下是我的尝试:
尝试 #1:简单的父子
让 CosmeticBase 成为汽车 GameObject 的孩子会让 CosmeticBase 跟随汽车非常好看,但因为它现在通过转换来移动,天线/CosmeticBase 束中的物理表现不太好。物理看起来很糟糕,天线 GameObjects经常脱离和试图“追赶”CosmeticBase。
尝试 #2:天线与汽车之间的结合
下一步,我在汽车和CosmeticBase上破坏了父子关系,将CosmeticBase设置为一根固定的节,并将其连接到汽车身上。CosmeticBase现在正确跟随汽车,天线/Base 条件成功了,但这显然不奏效,因为这样天线的质量、阻力等信息就转移到了汽车的物理系统中。
尝试 #3:在 CosmeticBase 上移动位置
移除了 Base/Car 固定的连接,将 CosmeticBase 的 Rigdbody2D 变为 kinematic,然后在 FixedUpdate 中尝试以下内容:
BaseKinematicRb2D.position = CarRb2D.position + 偏移;
BaseKinematicRb2D.rotation = CarRb2D.rotation;
这几乎是有效的,但并没有完全实现。天线/CosmeticBase 条件工作良好,CosmeticBase 尝试匹配汽车的位置,但它视觉上明显落后汽车,很明显因为它匹配汽车在上一个“tick” 中的位置,而不是它将要去的地方。通过调整所有 Rigidbody2D 的粘滞度设置,未能改变最终结果尝试了。
尝试 #4:同上,但使用预测速度
我走了最近的一步:
Vector2 predictedPos = (Vector2)CarRb2D.transform.TransformPoint(positionOffset) + CarRb2D.velocity * Time.fixedDeltaTime;
float predictedRot = CarRb2D.rotation + CarRb2D.angularVelocity * Time.fixedDeltaTime + rotationalOffset;
BaseKinematicRb2D.MovePosition(predictedPos);
BaseKinematicRb2D.MoveRotation(predictedRot);
CosmeticBase会在此物理步骤中“猜测”它应该在哪里。
这是... okay。它在汽车使用了 AddForce 的时候工作良好,但对于突然加速或减速,会有一些可察觉的漂浮。你不喜欢它。显然,这对于 MovePosition 没有太大作用,但这并不是很困难的任务。
问题是,这并不是非常独特的事情,所以我觉得一定有某种行业标准解决方案在这里被忽略了。我很难想象 Rocket League 是使用预测速度的。有没有人有任何建议?
为了总结,目标是:
我想基于物理学的动态、Physics2D启用的美肤应该能够跟随车辆,真实地反应运动。然而,汽车的物理行为应该完全被美肤的物理行为所影响。
有人遇到过这种情况吗?有没有什么令人惊叹的想法?
评论 (0)