簡體   English   中英

鼠標不在屏幕上時如何停止運動

[英]How to stop movement, when mouse is off screen

我希望那里有人可以幫助我解決一個小問題。

目前,我在主攝像頭上附加了一個輸入管理器,以允許用戶通過將鼠標移至窗口的邊緣來平移地圖,但是我遇到了一個小問題,嘗試將其修復為無濟於事。

如果鼠標移到窗口之外,則平移仍然會發生,當我調試或使用其他應用程序時,會感到惱怒。 因此,我希望當鼠標位於游戲窗口之外時,有人可以幫助我停止移動。

這是我的輸入管理器的代碼。

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

感謝您的時間。

編輯

我想出了一個解決方法,但是它仍然會導致移動發生在窗口外部的某些位置。 我希望有人能提出更好的解決方案。

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

由於Unity和各種主機操作系統交互的方式,您對鼠標光標的控制有限。 (總之,操作系統控制Unity鼠標來讀取它)也就是說,您確實有一些選擇。 Screen.lockCursor

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

它不能完全滿足您的要求,但可能是一個很好的起點

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.mousePosition Y軸指向上方...因此, bottomBorder Rect必須位於頂部, topBorder必須位於底部。 左右邊框不受影響。

Time.speed = 0;

這是你想要的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM