与将球员物体投掷在空中的刚体碰撞

时间:2016-09-26 05:00:55

标签: c# unity3d game-physics

我的角色控制者和我的敌人附有Rigidbody。我希望敌人能够围住我并让我陷入困境而不能让我移动,所以我相应地设置了质量属性。

这只是一个小问题 - 如果我没有将我的质量设置得足够高,那么当敌人与我发生碰撞时,我的玩家将会飞向空中。如果我不把敌人的质量设置得足够高,我就可以穿过它们。我该如何解决这个问题?以下是播放器的移动代码:

using UnityEngine;
using System.Collections;

public class CharController : MonoBehaviour {

    public float speed;

    void Start () {
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update () {
        float translation = Input.GetAxis ("Vertical") * speed;
        float strafe = Input.GetAxis ("Horizontal") * speed;
        translation *= Time.deltaTime;
        strafe *= Time.deltaTime;

        transform.Translate (strafe, 0, translation);

        if (Input.GetKeyDown ("escape")){
            Cursor.lockState = CursorLockMode.None;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

这里的问题是你使用Transform.Translate()来移动你的玩家对象。结果,玩家在物理计算之间被移动到你的敌人物体的剪辑 - 所以当下一次物理计算到来时,会有一个巨大的排斥力来纠正这个。这就是让你的玩家飞行的原因。

更好的选择是使用Rigidbody.AddForce()(或其变体之一)间接移动玩家对象。这允许在物理计算期间考虑玩家对象的移动,因此它可以在敌人对象开始剪切之前与敌人碰撞并被其拦截。

如果您在变量中检索并存储了对玩家Rigidbody的引用,那么您可以将Translate()替换为:

rigidbody.AddRelativeForce(strafe, 0, translation);

希望这有帮助!如果您有任何问题,请告诉我。

答案 1 :(得分:1)

确保选中IsKinematic。可以检查UseGravity是否取决于您的情况。

这样,你的刚体就不会受到力,碰撞或关节的影响,并且完全可以控制你的剧本。但也许他们也会失去检测碰撞的能力,但我不太确定,我还没有测试过它。

如果是这种情况,请取消选中IsKinematic,同时检查FreezeRotationFreezePosition。这样,您就可以撤消对物理的控制,从而影响您的位置和旋转。你将手动操纵位置和从脚本中旋转(使用CharacterController)。

参考文献:

https://docs.unity3d.com/ScriptReference/Rigidbody-isKinematic.html https://docs.unity3d.com/Manual/class-Rigidbody.html