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

Unity鼠标跟随物体问题:鼠标移出相机范围时停止跟随

解决Unity鼠标移出相机范围时停止物体跟随的问题

嘿,我来帮你搞定这个问题!核心思路是判断鼠标位置是否处于相机的可视范围内,只有在范围内的时候才让物体继续跟随鼠标。

Unity里可以用Camera.ScreenToViewportPoint(Input.mousePosition)来获取鼠标的视口坐标——视口坐标的x和y值范围都是0到1,超出这个范围就说明鼠标已经移出相机画面了。

下面是修改后的完整代码,我补全了你没写完的部分,同时加入了鼠标范围判断:

private Vector3 _target;
public Camera Camera;
public bool FollowMouse;
public bool ShipAccelerates;
public float ShipSpeed = 2.0f;
public float offset = 0.0f;

public void OnEnable()
{
    if (Camera == null) 
        throw new InvalidOperationException("Camera not set");
}

public void Update()
{
    // 先判断鼠标是否在相机视口范围内
    Vector3 mouseViewportPos = Camera.ScreenToViewportPoint(Input.mousePosition);
    bool isMouseInCamera = mouseViewportPos.x >= 0 && mouseViewportPos.x <= 1 
                          && mouseViewportPos.y >= 0 && mouseViewportPos.y <= 1;

    // 只有当鼠标在相机内,并且满足FollowMouse或按住左键的条件时,才更新目标位置
    if (isMouseInCamera && (FollowMouse || Input.GetMouseButton(0)))
    {
        // 将鼠标屏幕坐标转换为世界坐标,添加offset控制Z轴(根据你的需求调整)
        _target = Camera.ScreenToWorldPoint(new Vector3(Input.mousePosition.x, Input.mousePosition.y, offset));
        // 让物体向目标移动
        if (ShipAccelerates)
        {
            // 如果有加速逻辑,这里可以写对应的处理
            transform.position = Vector3.MoveTowards(transform.position, _target, ShipSpeed * Time.deltaTime);
        }
        else
        {
            transform.position = Vector3.Lerp(transform.position, _target, ShipSpeed * Time.deltaTime);
        }
    }
    // 如果鼠标移出相机,物体就停止跟随,保持当前位置
}

关键细节说明:

  • ScreenToViewportPoint:把屏幕坐标(像素)转换成相机视口的相对坐标,这样不管屏幕分辨率是多少,都能准确判断鼠标是否在画面内。
  • 你可以根据需求调整边界判断的阈值,比如把0改成0.02f,1改成0.98f,避免鼠标刚碰到边缘就停止跟随的生硬感。
  • offset参数用来控制物体在Z轴上的位置,确保它在相机的可视范围内(如果是2D项目,通常设置成相机的远裁剪面到物体的距离)。

内容的提问来源于stack exchange,提问作者Anghelina Guznac

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:59:50