Unity中如何让物体以指定恒定速度向鼠标位置移动?
解决Unity物体向鼠标恒定速度移动的问题
你当前代码用Vector2.Lerp的方式会导致速度不恒定,因为Lerp的插值比例是相对距离的百分比——鼠标离得越远,相同比例下移动的绝对距离就越大,自然速度变快。要实现恒定速度,得基于方向向量+归一化来处理,具体做法如下:
修改后的代码
public class PlayerMovement : MonoBehaviour { // 这里直接设置恒定速度,单位是世界空间单位/秒(如果要对应px,需根据相机正交尺寸换算) public float moveSpeed = 20f; void Update() { // 获取鼠标的世界空间位置 Vector3 mousePosition = Input.mousePosition; // 正交相机下,Z值设为和物体一致,避免位置偏移 mousePosition.z = transform.position.z; mousePosition = Camera.main.ScreenToWorldPoint(mousePosition); // 计算指向鼠标的方向向量 Vector3 moveDirection = mousePosition - transform.position; // 归一化方向(确保长度为1,这样乘以速度后就是恒定的每秒移动距离) if (moveDirection.magnitude > 0.01f) // 避免距离极近时的微小抖动 { moveDirection.Normalize(); // 按恒定速度移动 transform.position += moveDirection * moveSpeed * Time.deltaTime; } } }
关键说明
- 方向向量归一化:
moveDirection.Normalize()把向量长度缩为1,这样不管鼠标距离多远,每帧移动的距离都是moveSpeed * Time.deltaTime,保证速度恒定。 - Z轴处理:把鼠标位置的Z值设为和物体一致,避免因相机
ScreenToWorldPoint的Z值问题导致物体位置异常(尤其是正交相机场景)。 - 抖动避免:加了
moveDirection.magnitude > 0.01f的判断,当物体接近鼠标时停止移动,防止微小的来回抖动。
如果你的项目是2D场景,也可以用Vector2来简化代码,逻辑完全一致。
内容的提问来源于stack exchange,提问作者Meskyy404
相关产品推荐
相关产品推荐

