当鼠标离开屏幕时如何停止移动

2023-12-07

我希望有人可以帮助我解决一个小问题。

目前,我在主摄像头上附加了一个输入管理器,允许用户通过将鼠标移动到窗口边缘来平移地图,但我遇到了一个小问题,我尝试自行修复但无济于事。

如果鼠标移出窗口,平移仍然会发生,当我调试或使用其他应用程序时,我觉得这很烦人。所以我希望有人可以帮助我阻止鼠标在游戏窗口之外时发生的移动。

这是我的输入管理器的代码。

using UnityEngine;
using System.Collections;

public class InputManager : MonoBehaviour {

    public Vector3 position = new Vector3(0,0, -10);
    public int boundary = 50;
    public int speed = 4;

    private int screenBoundsWidth;
    private int screenBoundsHeight;

    // Use this for initialization
    void Start()
    {
        screenBoundsWidth = Screen.width;
        screenBoundsHeight = Screen.height;

    }

    // Update is called once per frame
    void Update()
    {
        if (Input.mousePosition.x > screenBoundsWidth - boundary) {
            position.x += speed * Time.deltaTime;
        }

        if (Input.mousePosition.x < 0 + boundary) {
            position.x -= speed * Time.deltaTime;
        }

        if (Input.mousePosition.y > screenBoundsHeight - 10) {
            position.y += speed * Time.deltaTime;
        }

        if (Input.mousePosition.y < 0 + boundary) {
            position.y -= speed * Time.deltaTime;
        }   

        Camera.mainCamera.transform.position = position;
    }
}

感谢您的时间。

EDIT

我想出了一个巧妙的解决方法,但它仍然会导致窗口外部周围的某些位置发生移动。我希望有人能提出更好的解决方案。

if (Input.mousePosition.x  < screenBoundsWidth && Input.mousePosition.y < screenBoundsHeight) {
    if (Input.mousePosition.x > screenBoundsWidth - boundary) {
        position.x += speed * Time.deltaTime;
    }
}

if (Input.mousePosition.x > 0 && Input.mousePosition.y > 0) {
    if (Input.mousePosition.x < 0 + boundary) {
        position.x -= speed * Time.deltaTime;
    }
}

if (Input.mousePosition.y < screenBoundsHeight && Input.mousePosition.x < screenBoundsWidth) {
    if (Input.mousePosition.y > screenBoundsHeight - 22) {
        position.y += speed * Time.deltaTime;
    }
}

if (Input.mousePosition.y > 0 && Input.mousePosition.x > 0) {
    if (Input.mousePosition.y < 0 + boundary) {
        position.y -= speed * Time.deltaTime;
    }
}

3 Ideas:

Rect screenRect = new Rect(0,0, Screen.width, Screen.height);
if (!screenRect.Contains(Input.mousePosition))
    return;

同样可以更详细地写为:

float mouseX = Input.MousePosition.x;
float mouseY = Input.MousePosition.y;
float screenX = Screen.width;
float screenY = Screen.height;

if (mouseX < 0 || mouseX > screenX || mouseY < 0 || mouseY > screenY)
    return;

// your Update body

...这与您的“hacky”解决方案几乎相同(恕我直言,这是完全有效的)。

另一种选择是为每个屏幕边框创建 4 个 Rect 对象,然后检查鼠标是否在这些矩形内。例子:

public float boundary = 50;
public float speed = 4;
private Rect bottomBorder;
private Rect topBorder;
private Transform cameraTransform;

private void Start()
{
    cameraTransform = Camera.mainCamera.transform
    bottomBorder = new Rect(0, 0, Screen.width, boundary);
    topBorder = new Rect(0, Screen.height - boundary, Screen.width, boundary);
}

private void Update()
{
    if (topBorder.Contains(Input.mousePosition))
    {
        position.y += speed * Time.deltaTime;
    }

    if (bottomBorder.Contains(Input.mousePosition))
    {
        position.y -= speed * Time.deltaTime;
    }

    cameraTransform.position = position;
}

这里棘手的部分是Rect坐标的 Y 轴向下并且Input.mousePositionY 朝上...所以bottomBorder Rect必须在顶部,并且topBorder必须在底部。左右边框不受影响。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当鼠标离开屏幕时如何停止移动 的相关文章

随机推荐