輸入監控
鼠標幾何輸入
使用GetMouseButton來獲取鼠標按鍵的事件:
public static bool Input.GetMouseButton(int button);
public static bool Input.GetMouseButtonUp(int button);
public static bool Input.GetMouseButtonDown(int button);
其中,button爲0時獲得的是鼠標左鍵,1則爲鼠標右鍵,2爲鼠標中鍵。
public static Vector3 Input.mousePosition;
該屬性返回鼠標的屏幕座標。屏幕座標是根據像素來確定的二維向量,以屏幕的左下角爲(0, 0),以屏幕的右上角爲(Screen.width, Screen.height)。而z軸座標則始終爲0。
使用Camera的座標轉換功能可以將剛得到的屏幕座標轉化爲世界空間座標:
public class MousePosition : MonoBehaviour
{
Camera mainCamera;
private void Start()
{
mainCamera = Camera.main;
}
private void Update()
{
Debug.Log(mainCamera.ScreenToWorldPoint(Input.mousePosition));
}
}
Camera的座標轉換功能之後詳述。
通過GetAxis可以快速獲得鼠標在屏幕座標的偏移量:
public static float Input.GetAxis(string axisName);
public static float Input.GetAxisRaw(string axis Name);
使用"Mouse X"和"Mouse Y"這兩個軸名,可以檢測鼠標座標在上一幀到這一幀的變化量:
public class MousePosition : MonoBehaviour
{
private void Update()
{
Debug.Log(new Vector2(Input.GetAxis("Mouse X"),Input.GetAxis("Mouse Y")));
}
}
public static float Input.mouseScrollDelta;
每幀檢測,向上滾動返回正數,向下滾動返回負數,不滾動返回零。一般情況下返回1.0或-1.0,在滾動極快的情況下有可能出現2.0和-2.0。測試結果可能與所用的鼠標有關。
使用GetAxis(“Mouse ScrollWheel”)也可以獲取鼠標滾輪信息:
public class ScrollWheel : MonoBehaviour
{
private void Update()
{
Debug.Log(Input.GetAxis("Mouse ScrollWheel"));
}
}
這個方法返回的值同樣在向上時爲正,在向下時爲負,在不滾動時爲0,但其值一般情況下是0.1和-0.1,較快時出現0.2、-0.2。
觸摸屏幾何輸入
Unity封裝了Touch類來處理觸摸屏事件。每當一個觸摸事件產生,就會按順序生成一個Touch實例,並持續跟蹤這個觸摸,直到手指完全離開屏幕。這個列表可以通過Touch.touches來訪問。
public static int Input.touchCount;
public static Touch[] Input.touches;
public static Touch Input.GetTouch(int index);
默認情況下可以將單個手指的觸碰解讀爲鼠標左鍵,將雙指觸碰解讀爲鼠標右鍵,並用mousePosition獲取單個觸摸發生的位置。開發者可以手動關閉這個功能:
public static bool Input.simulateMouseWithTouches = true;
追蹤這個Touch實例可以獲得的消息有:
public int Touch.fingerID;
public Vector2 Touch.position;
public Vector2 Touch.deltaPosition;
public TouchPhase Touch.phase;
public float Touch.deltaTime;
public int Touch.tapCount;
fingerID:返回這個觸摸在Input.touches中的下標。當其他觸摸結束時,這個下標有可能改變。
position:返回這個觸摸的屏幕座標。
deltaPosition:返回這個觸摸的位置在上一幀到這一幀的變化量。
phase:用於檢測這個觸摸的狀態。
TouchPhase.Began:表示在這一幀中剛檢測到觸摸狀態,開始追蹤觸摸點。
TouchPhase.Stationary:表示在這一幀中觸摸點幾乎沒有位移。
TouchPhase.Move:表示在這一幀中觸摸點的位移大於閾值,理解爲拖動。
TouchPhase.Ended:當手指離開屏幕時,Touch對象不會立刻刪除,而是在一定時間內繼續跟蹤。如果手指在這段時間內重新落下,且位移沒有超過閾值,則理解爲雙擊或多擊。否則Touch就會進入Ended狀態,並在下一幀中被刪除。
TouchPhase.Canceled:表示這一幀中因爲手指觸摸數量過多、手機進入臉頰模式、應用被來電打斷等事件,操作系統停止提供觸摸點,而使程序對這個Touch的追蹤被取消,這也將導致在下一幀中對應的Touch被刪除。
deltaTime:當前時間與上一次觸摸數據更新時間的間隔。
tapCount:短時間內連續點擊的次數,只有兩次點擊的位置足夠靠近纔會被計入tapCount,否則會被理解爲兩次不同的觸摸。
實例:使用觸摸拖動來實現物體旋轉:
public class DragRotating : MonoBehaviour
{
[SerializeField]
private float dragSpeed = 1;
[SerializeField]
private Transform target;
private Camera mainCamera;
private void Start()
{
mainCamera = Camera.main;
}
private void FixedUpdate()
{
Drag();
}
private void Drag()
{
if(Input.touchCount == 0) return;
Touch touch = Input.GetTouch(0);
Vector3 axis = Vector3.Cross(touch.deltaPosition, mainCamera.transform.forward);
target.Rotate(axis, touch.deltaPosition.magnitude * dragSpeed, Space.World);
}
}
有些移動端(如IPad和Surface)可以獲取按壓的力度:
public static bool Input.touchPressureSupported;
public float Touch.maximumPossiblePressure;
public float Touch.pressure;
其它移動端幾何輸入
public static Vector2 Input.acceleration;
獲得手機的加速度數據,根據手機傾斜的角度,手機右側向下傾斜時x爲負,左側向下傾斜時x爲正,手機上方向下傾斜時y爲正,下方向下傾斜時y爲負,可以得到-1.0至1.0的浮點數。
注:3D世界座標y軸朝上,x-z平面纔是地面,所以想讓物體沿地面運動則必須注意三個軸對應的位置。
實例:使用手機重力感應實現3D滾球
[RequireComponent(typeof(Rigidbody))]
public class GravityBall : MonoBehaviour
{
[SerializeField]
private float speed;
private Rigidbody rgb;
private void Start()
{
rgb = GetComponent<Rigidbody>();
}
private void FixedUpdate()
{
Vector2 acceleration = Input.acceleration;
if(acceleration.sqrMagnitude > 1) acceleration.Normalize();
Vector3 direction = new Vector3(acceleration.x, 0, acceleration.y);
rgb.velocity = direction * speed;
}
}
在移動端上除了Input.acceleration外,還有Input.gyro來獲取手機的三軸角速度(陀螺儀),以及使用Input.compass來獲得手機的磁向量(指南針)。綜合使用這三個屬性,利用互補濾波可以計算出手機具體的空間狀態。