Unity全面入門筆記18-幾何輸入

輸入監控

鼠標幾何輸入

  • 鼠標點擊事件

使用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。

觸摸屏幾何輸入

  • Touch類

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來獲得手機的磁向量(指南針)。綜合使用這三個屬性,利用互補濾波可以計算出手機具體的空間狀態。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章