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

Unity中如何让角色移动时不因目标距离远而加速(C#)

解决Unity俯视角角色恒定速度移动问题

你当前代码的问题出在Vector2.Lerp的使用上——这个方法的第三个参数是插值比例,不是移动速度。比如目标离角色10单位时,每次FixedUpdate会移动当前距离的10%(也就是1单位);如果目标只离1单位,每次只移动0.1单位,所以鼠标越远角色移动越快。

要实现恒定速度移动,应该基于方向向量来计算每帧移动的距离,以下是修改后的代码:

using UnityEngine;

public class Movement : MonoBehaviour {
    // 移动速度(单位/秒)
    public float moveSpeed = 5f;
    private Rigidbody2D rb;
    // 目标位置,用Vector2适配2D场景
    private Vector2 targetPosition;
    // 判定是否到达目标的阈值(避免微小抖动)
    public float reachThreshold = 0.1f;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        // 初始化目标位置为当前角色位置
        targetPosition = transform.position;
    }

    private void FixedUpdate()
    {
        if (Input.GetMouseButton(0))
        {
            // 将鼠标屏幕坐标转为世界坐标,注意Z轴设为0(2D游戏不需要深度)
            Vector3 mouseWorldPos = Camera.main.ScreenToWorldPoint(Input.mousePosition);
            targetPosition = new Vector2(mouseWorldPos.x, mouseWorldPos.y);
        }

        // 计算角色到目标的向量
        Vector2 direction = targetPosition - (Vector2)transform.position;
        // 判断是否已经接近目标
        if (direction.magnitude > reachThreshold)
        {
            // 归一化方向向量(长度变为1,保证方向正确且速度恒定)
            direction.Normalize();
            // 计算每FixedUpdate的移动距离:速度 * 固定时间步,保证跨设备速度一致
            Vector2 moveStep = direction * moveSpeed * Time.fixedDeltaTime;
            // 移动角色
            rb.MovePosition((Vector2)transform.position + moveStep);
        }
    }
}

关键修改说明:

  • 把moveSpeed改成单位/秒的实际速度(比如设为5,就是每秒移动5个单位),更符合直觉
  • 用direction.Normalize()确保不管目标远近,方向向量的长度都是1,这样乘以速度后每帧移动的距离固定
  • 加入reachThreshold,当角色离目标足够近时停止移动,避免角色在目标点来回抖动
  • 使用Time.fixedDeltaTime,因为FixedUpdate的调用间隔是固定的,这样计算出来的移动距离不受帧率影响,不同设备上速度一致

你可以根据游戏的手感调整moveSpeed和reachThreshold的数值,比如觉得移动太慢就增大moveSpeed,抖动明显就调大reachThreshold。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 05:12:50