2

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

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

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

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

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;
    }
}

感谢您的时间。

编辑

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

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;
    }
}
4

3 回答 3

1

3个想法:

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必须在底部。左右边框不受影响。

于 2013-06-16T04:46:01.433 回答
0

由于 Unity 和各种主机操作系统的交互方式,您对鼠标光标的控制有限。(简而言之,操作系统控制鼠标 Unity 只是读取它)话虽如此,您确实有一些选择。Screen.lockCursor跳到脑海。

http://docs.unity3d.com/Documentation/ScriptReference/Screen-lockCursor.html

它不会完全符合您的要求,但它可能是一个很好的起点

于 2013-06-15T17:03:08.203 回答
0

时间.速度 = 0;

这是你想要的吗?

于 2013-06-18T12:43:37.320 回答