1. 程式人生 > >螢幕滑動操作方案

螢幕滑動操作方案

目標:判斷滑動螢幕方向,只調用一次滑動事件處理函式

因為功能簡單易懂,程式碼也比較簡單,不再詳細說明,參考官方API:http://docs.unity3d.com/ScriptReference/EventType.html

using UnityEngine;
using System.Collections;

public class Player : MonoBehaviour {

	enum slideVector { nullVector, left, right };

	private Vector2 lastPos;//上一個位置

	private Vector2 currentPos;//下一個位置

	private slideVector currentVector = slideVector.nullVector;//當前滑動方向

	private float timer;//時間計數器

	public float offsetTime = 0.01f;//判斷的時間間隔

	// Use this for initialization
	void Start () {
		
	}
	
	// Update is called once per frame
	void Update () {
		
	}
	void OnGUI(){
		if (Event.current.type == EventType.MouseDown) {//滑動開始
			lastPos = Event.current.mousePosition;
			currentPos = Event.current.mousePosition;
			timer = 0;

			//TODO click event
			Debug.Log ("Click begin && Drag begin");
		}

		if (Event.current.type == EventType.MouseDrag) {//滑動過程
			currentPos = Event.current.mousePosition;
			timer += Time.deltaTime;
			if (timer > offsetTime) {
				if (currentPos.x < lastPos.x) {
					if (currentVector == slideVector.left) {
						return;
					}
					//TODO trun Left event

					currentVector = slideVector.left;
					Debug.Log ("Turn left");
				} 
				if (currentPos.x > lastPos.x) {
					if (currentVector == slideVector.right) {
						return;
					}
					//TODO trun right event

					currentVector = slideVector.right;
					Debug.Log ("Turn right");
				}

				lastPos = currentPos;
				timer = 0;
			}		
		}

		if (Event.current.type == EventType.MouseUp) {//滑動結束
			currentVector = slideVector.nullVector;
			Debug.Log ("Click over && Drag over");
		}
	}
}

上次時間不多隻寫了一種方案,現在補充一下。

上方案可以實現目標功能,但是還有很多地方可以優化。

如:1:增加有效距離防止錯誤判斷。2:功能可不可以在OnGUI上寫(因為這樣的話對於檢測掌控不方便)。3:多樣化判斷。

為了解決以上問題,提出集中解決方法和優化方案。

首先,滑動判定的原理其實大家都懂,檢測移動距離判定。我們只需要能檢測到滑鼠按下、滑鼠按住、滑鼠鬆開的三個狀態即可。

一:使用Input.GetMouseButtonDown(0)

這種方法應該是我們最熟悉的,不多說直接上程式碼:

if (Input.GetMouseButtonDown (0)) {
			lastPos = Input.mousePosition;
			currentPos = Input.mousePosition;
			timer = 0;
		}
		if (Input.GetMouseButton (0)) {
			currentPos = Input.mousePosition;
			timer += Time.deltaTime;
			if (timer > offsetTime) {
				if (currentPos.x < lastPos.x) {
					if (currentVector == slideVector.left) {
						return;
					}
					//TODO trun Left event
					lastVector = slideVector.left;
					currentVector = slideVector.left;
					if (player != null) {
						player.AttackLeft ();
					}
					//Debug.Log ("Turn left");
				} 
				if (currentPos.x > lastPos.x) {
					if (currentVector == slideVector.right) {
						return;
					}
					//TODO trun right event
					lastVector = slideVector.right;
					currentVector = slideVector.right;
					if (player != null) {
						player.AttackRight ();
					}
					//Debug.Log ("Turn right");
				}

				lastPos = currentPos;
				timer = 0;
			}
		}
		if (Input.GetMouseButtonUp (0)) {
			if (lastVector != slideVector.nullVector && currentVector == slideVector.nullVector) {
				if (lastVector == slideVector.left) {
					//TODO trun Left event
					//Debug.Log("click attack left++++++++++++");
					player.AttackLeft();

				} else {
					//Debug.Log("click attack right++++++++++++");
					player.AttackRight();
				}
			}
			currentVector = slideVector.nullVector;
		}


這種方法很好理解,可以直接執行或修改,跟上面的比增加了有效距離的判定,想要增加其他滑動檢測在基礎上簡單修改即可。

說明:這種方法在Update中執行,開關檢測需要用訊號來實現。還有一種方式就是把檢測放在協程裡面,利用開關協程來開關檢測。本方法是全屏的,不論是在控制元件上滑動還是在空白區域都生效。若不想在控制元件上生效,請自行做遮罩處理。

其他方法:利用UGUI的Event系統,UGUIEvent系統提供包括點選、按下、按住、移動、鬆開等多種與使用者互動事件,只需要實現他們的函式介面便能實現對應效果,而且種類很多,讀者可以試一試。