我目前正在Unity3d中开发空气曲棍球游戏。我遇到的问题是,当玩家尝试过快击打冰球时,玩家最终会穿过冰球,因此不会发生碰撞。如果玩家静止不动并且冰球击中了玩家,或者玩家以缓慢的速度击中了冰球,则游戏可以按预期正常运行。

播放器具有使用胶囊对撞机进行连续碰撞检测的刚体。圆盘还具有具有连续动态碰撞检测功能的刚体和具有凸面的网状对撞机。

我尝试将固定时间步长设置为0.01,但是没有效果。这是播放器移动的脚本:

void ObjectFollowCursor()
{
    Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
    Vector3 point = ray.origin + (ray.direction * distance);

    Vector3 temp = point;
    temp.y = 0.2f; // limits player on y axis

    cursorObject.position = temp;
}

以下是冰球与玩家碰撞时的代码:
// If puck hits player
if(collision.gameObject.tag == "Player")
{
    Vector3 forceVec = this.GetComponent<Rigidbody>().velocity.normalized * hitForce;
    rb.AddForce(forceVec, ForceMode.Impulse);
    Debug.Log ("Player Hit");
}

任何帮助将非常感激。谢谢。

最佳答案

您尝试连续碰撞检测(CCD)是正确的。存在一些限制(特别是在这种情况下,您想将CCD与两个移动对象而不是一个移动对象和一个静态对象一起使用),但是它是为这种情况而设计的。 The Rigidbody documentation进入以下约束:



总结起来,圆盘和 Racket 都需要设置为“连续动态”,并且都必须是“箱式”,“球形”或“胶囊碰撞器”。如果您可以使这些约束适用于您的游戏,那么您无需编写自己的代码就能获得连续的碰撞检测功能。

关于Unity CCD的注释需要重复:



但是由于您是手动指定碰撞 react ,所以这可能不是问题。

关于c# - 空中曲棍球游戏-如果移动太快, bat 会通过冰球,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33830285/

10-10 14:00