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

Unity3D实现角色按住移动键持续移动功能问题咨询

问题原因

你当前使用的Input.GetKeyDownAPI仅会在按键按下的第一帧返回一次true,所以只会给刚体施加一次推力,自然只能单次移动。

解决方案

把Input.GetKeyDown替换为Input.GetKey即可,这个API会在按键处于按住状态的每帧都返回true,每帧持续施加推力就能实现按住移动的效果。

另外注意你原有代码里的Keycode拼写有误,正确写法是KeyCode(C大写),C#大小写敏感,错误拼写会触发编译报错。

基础修改代码

void Update()
{
    if (Input.GetKey(KeyCode.W)) {
       rb.AddForce(Vector3.forward * speed);
    }
}

优化建议

物理相关操作建议放在FixedUpdate中执行,避免因为设备帧率波动导致移动速度不一致,同时可以添加最大速度限制避免角色越跑越快:

public float maxSpeed = 5f;
private bool moveForward;

void Update()
{
    // 输入检测保留在Update中,避免帧率过低漏判按键操作
    moveForward = Input.GetKey(KeyCode.W);
}

void FixedUpdate()
{
    if (moveForward)
    {
        rb.AddForce(Vector3.forward * speed);
        // 限制最大移动速度
        if (rb.velocity.magnitude > maxSpeed)
        {
            rb.velocity = rb.velocity.normalized * maxSpeed;
        }
    }
}

如果你不需要物理模拟的惯性效果,想要更干脆的移动手感,也可以直接修改刚体的velocity属性:

void FixedUpdate()
{
    if (moveForward)
    {
        // 保留y轴速度,不影响跳跃下落效果
        rb.velocity = new Vector3(0, rb.velocity.y, speed);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 00:06:01