You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Unity无人机游戏开发:按住升降键后无法保持恒定高度问题求助

问题原因

你的代码逻辑本身已经实现了「按住按键才调整升力」的规则,出现松开按键后还持续升降的核心原因是刚体的残留速度没有被处理:你在松开Q/E后仅把升力重置为刚好抵消重力的大小,但是之前按键过程中积累的Y轴升降速度还会保留,无人机会沿着原来的运动方向继续移动。

修复方案

你只需要补充无按键输入时的Y轴速度阻尼逻辑,就能实现松开按键立刻稳停的效果,修改后的完整代码如下:

using UnityEngine;

public class Levitating : MonoBehaviour
{
    Rigidbody ourDrone;

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

    // 抵消重力的默认升力
    private Vector3 DRONE_DEFAULT_VELOCITY = new Vector3(0, 9.81f, 0);
    public float upForce;
    // 新增可调节参数,直接在Inspector面板调整手感
    public float upwardPower = 15f;
    public float downwardPower = 3f;
    public float heightDamping = 8f; // 数值越大,松开按键后停得越快

    private void Update()
    {
        MovementUpDown();
    }

    private void FixedUpdate()
    {
        ourDrone.AddRelativeForce(DRONE_DEFAULT_VELOCITY * upForce);
        // 新增阻尼逻辑:无按键输入时抵消Y轴残留速度
        if (!Input.GetKey(KeyCode.E) && !Input.GetKey(KeyCode.Q))
        {
            Vector3 velocity = ourDrone.velocity;
            velocity.y = Mathf.Lerp(velocity.y, 0, Time.fixedDeltaTime * heightDamping);
            ourDrone.velocity = velocity;
        }
    }

    void MovementUpDown()
    {
        if (Input.GetKey(KeyCode.E))
        {
            upForce = upwardPower;
        }
        else if (Input.GetKey(KeyCode.Q))
        {
            upForce = -downwardPower;
        }
        else
        {
            upForce = 1;
        }
    }
}
调整说明
  • 你可以在Inspector面板调整heightDamping的数值,数值越大松开按键后悬停越灵敏,数值越小移动过程越平滑
  • upwardPower和downwardPower分别对应E键上升、Q键下降的速度,可根据你的游戏手感需求自由调整

内容的提问来源于stack exchange,提问作者Culling_Card2121

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 01:45:06