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

Unity中鼠标位置数值过大、出屏仍生效问题的解决方法

玩家向鼠标移动的问题修复方案

问题根源

  1. 直接使用Input.mousePosition得到的是屏幕像素坐标,数值量级和游戏世界坐标不匹配,导致移动逻辑异常
  2. 你的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 16:02:41