【问题标题】:Rigidbody character bouncing when colliding with walls (Autowalk.cs)刚体角色在与墙壁碰撞时弹跳 (Autowalk.cs)
【发布时间】:2016-08-07 06:25:51
【问题描述】:

我正在为 Google Cardboard 构建一个 VR 迷宫游戏,其中 https://github.com/JuppOtto/Google-Cardboard/blob/master/Autowalk.cs 作为移动玩家的脚本。到目前为止,我还没有找到任何对我有帮助的东西,我尝试过处理物理材料、冻结/解冻刚体的约束、将角阻力设置为无穷大等。

据我所知,问题应该是我的刚体穿透了上面有网格碰撞器的墙壁,它被推回,导致了这种奇怪的“有弹性的行为”。几乎感觉就像刚体角色一直试图穿过墙壁,即使它做不到。

在大多数情况下,这不是什么大问题,但游戏中的某些角落有其他较小的物体,上面也有网格碰撞器,如果玩家进入这些物体和墙壁之间,他们只会被推(弹跳)出游戏区域并完全穿过墙壁。

这是负责我的角色移动的部分,我认为必须将其更改为其他内容:

if (isWalking) 
{
    Vector3 direction = new Vector3(head.transform.forward.x, 0, head.transform.forward.z).normalized * speed * Time.deltaTime;
    Quaternion rotation = Quaternion.Euler(new Vector3(0, -transform.rotation.eulerAngles.y, 0));
    transform.Translate(rotation * direction);
}

以下是关于我的设置的一些信息:

具有运动脚本的角色有一个胶囊碰撞器和一个质量为:1 的刚体;阻力和角度阻力:0;使用重力,不是运动学的,插值设置为无,碰撞检测设置为离散。位置未冻结,但旋转适用于所有 X、Y 和 Z 坐标,因此不会倒下。

墙壁(3D 模型)上有一个简单的网格碰撞器,仅此而已。

我想我还应该提到我不希望角色在与墙壁碰撞时停下来,因此我不认为使用触发器是个好主意。完全停止只有在玩家正面面对墙壁时才可以接受,但如果有角度,我希望玩家沿着墙壁“滑动”。

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    您也可以删除 Rigidbody 组件,而在播放器上使用 CharacterController 组件,并使用 SimpleMove 函数而不是翻译播放器。 Translate 函数将玩家设置在一个新的 Vector 位置,这将使玩家与墙壁相交而不是与墙壁发生碰撞。

    【讨论】:

    • 感谢您的评论。我选择这个作为接受的答案,因为切换到 CharacterController 是我最终要做的事情,它为我解决了所有问题。
    【解决方案2】:

    您必须打开interpolation(将其设置为Interpolate)并在刚体上设置isKinematic,然后改用Rigidbody.MovePositionMovePosition 插入到给定的位置并且不允许允许Rigidbody穿过对象。改为设置transform.positionRigidbody.position teleports Rigidbody,这可能是不可取的。

    您也可以使用 Rigidbody 并改用 CharacterController,这样可以更轻松地移动角色,而无需一直处理刚体。

    【讨论】:

    • 我应该如何在这个特定脚本中使用 MovePosition?我试过 rb.MovePosition(rotation * direction);这只是将玩家一半传送到被卡住的墙内。
    • @ynef 不是手动旋转方向,而是使用局部空间坐标。计算局部空间中的方向并转换到世界空间并改用MovePosition
    猜你喜欢
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多