Unity中鼠标位置数值过大、出屏仍生效问题的解决方法
玩家向鼠标移动的问题修复方案
问题根源
- 直接使用
Input.mousePosition得到的是屏幕像素坐标,数值量级和游戏世界坐标不匹配,导致移动逻辑异常 - 你的
ScreenToWorldPoint用法存在错误:鼠标的x/y坐标顺序写反,且z轴值设置不合理,导致转换后的世界坐标完全偏离预期
修复代码
public class PlayerMoveWithMouse : MonoBehaviour { [SerializeField] float speed = 5f; private Camera cam; void Start() { cam = Camera.main; // 2D游戏推荐使用正交相机,透视相机需额外调整z值逻辑 if (!cam.orthographic) { Debug.LogWarning("当前相机为透视模式,建议切换为正交模式适配2D移动逻辑"); } } void Update() { // 1. 获取正确的鼠标屏幕坐标,注意x/y顺序不要颠倒 Vector3 mouseScreenPos = Input.mousePosition; // 2. 设置z值:相机与玩家的z轴距离,确保转换后的坐标在玩家所在平面 mouseScreenPos.z = cam.transform.position.z - transform.position.z; // 3. 将屏幕坐标转换为世界坐标 Vector3 targetWorldPos = cam.ScreenToWorldPoint(mouseScreenPos); // 4. 转换为2D坐标(忽略z轴) Vector2 targetPos = new Vector2(targetWorldPos.x, targetWorldPos.y); // 限制鼠标移出屏幕时不执行移动 Vector3 mouseViewport = cam.ScreenToViewportPoint(Input.mousePosition); // 视口坐标范围为(0,0)到(1,1),超出此范围则跳过移动逻辑 if (mouseViewport.x is >= 0 and <= 1 && mouseViewport.y is >= 0 and <= 1) { transform.position = Vector2.MoveTowards(transform.position, targetPos, speed * Time.deltaTime); } } }
关键修复点
- 坐标顺序修正:
ScreenToWorldPoint的参数格式为(屏幕x坐标, 屏幕y坐标, z深度),你之前颠倒了x和y,导致目标位置完全错误 - z轴值设置:正交相机下,z值决定转换后的坐标所在平面,设置为相机与玩家的z轴差值,保证目标点和玩家处于同一平面
- 屏幕边界限制:通过
ScreenToViewportPoint判断鼠标是否在屏幕范围内,超出则停止移动,解决鼠标移出屏幕仍计算位置的问题 - 相机模式提示:2D游戏优先使用正交相机,透视相机的坐标转换逻辑更复杂,需要额外调整z值计算
内容的提问来源于stack exchange,提问作者RunningPath
相关产品推荐
相关产品推荐

