我希望有人可以帮助我解决一个小问题。
目前我有一个输入管理器连接到主摄像头,允许用户通过将鼠标移动到窗口的边缘来平移地图,但我遇到了一个小问题,我试图修复自己无济于事。
如果鼠标走出窗外,仍然会发生摇摄,我在调试或使用其他应用程序时会感到恼火。因此,我希望当鼠标在游戏窗口之外时,有人可以帮助我阻止发生的移动。
以下是我的输入管理器的代码。
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;
}
}
答案 0 :(得分:0)
由于Unity和各种主机操作系统的交互方式,您对鼠标光标的控制有限。 (简而言之,操作系统控制鼠标Unity只是读取它)据说你确实有一些选项。 Screen.lockCursor
跳了起来。
http://docs.unity3d.com/Documentation/ScriptReference/Screen-lockCursor.html
它不会完全符合您的要求,但它可能是一个很好的起点
答案 1 :(得分:0)
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”解决方案(完全有效的imho)非常相似。
另一种选择是为每个屏幕边框创建4个Rect对象,然后检查鼠标是否在这些rects中。例如:
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
必须在底部。左右边框不受影响。
答案 2 :(得分:0)
Time.speed = 0;
这就是你想要的吗?