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
相关产品推荐
相关产品推荐

