[英]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.