首页 > 解决方案 > Unity - 通过抵消重力创造一辆气垫车

问题描述

我希望实现一种创建hoverbike的方法。我当前悬停的代码是

readonly float yForce = 80;
Physics.Raycast(hoverbike.transform.position, Vector3.down, out hit);
Debug.Log(hit.distance);
if (hit.distance < 10 && hit.distance > 0)
{
   if (hoverbike.velocity.y < 0.1)
    {
        hoverbike.AddForce(0, yForce, 0, ForceMode.Acceleration);
        Debug.Log("applying force!");
    }
}

这行得通,但效果不佳,车辆会上下弹跳。我还尝试减去与自行车完全相同的力y velocity,但车辆慢慢向下漂移,并没有上升到我想要的距离地面 10 个单位的高度。我怎样才能做到这一点?简单地抵消它当前的速度很容易,但我如何让它漂浮回所需的高度呢?

标签: c#unity3d

解决方案


简单地关闭重力比不断地对抗它要容易得多。这种频繁的重新调整很可能是您有弹性的原因。激活自行车后,您可以将对象的y velocity计算完全掌握在自己手中,如下所示:

public class Bike : MonoBehaviour
{
    private Rigidbody hoverbike;
    private bool isBikeActive = false;

    [SerializeField] private float verticalSpeedMultiplier = 1f;
    [SerializeField] private float hoverHeight = 10f;
    [SerializeField] private float hoverTolerance = 0.5f;
    [SerializeField] private float maximumVerticalVelocity = 10f;

    private void Awake()
    {
        hoverbike = GetComponent<Rigidbody>();
    }

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space)) { ToggleBike(); }

        if (isBikeActive)
        {
            Physics.Raycast(hoverbike.transform.position, Vector3.down, out RaycastHit hit);

            Vector3 modifiedVelocity = hoverbike.velocity;

            if ((hit.distance > hoverHeight - hoverTolerance) && (hit.distance < hoverHeight + hoverTolerance))
            {
                modifiedVelocity.y = 0f;
            }
            else
            {
                modifiedVelocity.y = -(hit.distance - hoverHeight) * verticalSpeedMultiplier;
                modifiedVelocity.y = Mathf.Clamp(modifiedVelocity.y, -maximumVerticalVelocity, maximumVerticalVelocity);
            }

            Debug.Log($"Distance from ground: {hit.distance}, Bike Velocity.y: {modifiedVelocity}");
            hoverbike.velocity = modifiedVelocity;
        }
    }

    private void ToggleBike()
    {
        isBikeActive = !isBikeActive;
        hoverbike.useGravity = !isBikeActive;
    }
}

您的自行车现在将始终尝试向其hoverHeight下方对象上方的点单元移动,直到它位于hoverTolerance该点的范围内。它也将更加平稳地向该点移动,距离预期高​​度越远,移动速度越快。

如果您希望自行车仍然稍微上下摆动,这可以通过随着时间的hoverHeight推移慢慢修改来实现,也许通过使用正弦函数。


推荐阅读