与刚体碰撞,将玩家物体抛向空中

本文关键字:碰撞 玩家 | 更新日期: 2023-09-27 18:08:59

我有一个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;
        }
    }
}

与刚体碰撞,将玩家物体抛向空中

这里的问题是你使用Transform.Translate()来移动你的播放器对象。因此,在物理计算之间,玩家被移动到与敌人物体的夹击中——所以当下一次物理计算出现时,将会有一个巨大的排斥力来纠正这个问题。这就是让你的玩家飞起来的原因。

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

如果你在变量中检索并存储对玩家Rigidbody的引用,那么你可以用以下内容替换Translate():

rigidbody.AddRelativeForce(strafe, 0, translation);

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

确保IsKinematic被选中。UseGravity可以检查或不检查取决于您的情况。

这样,你的刚体将不会受到力,碰撞或关节的影响,并处于你的脚本的完全控制之下。但也许他们也会失去检测碰撞的能力,但我不太确定,我还没有测试过。

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

引用:

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