螢幕滑動操作方案
阿新 • • 發佈:2019-01-10
目標:判斷滑動螢幕方向,只調用一次滑動事件處理函式
因為功能簡單易懂,程式碼也比較簡單,不再詳細說明,參考官方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系統提供包括點選、按下、按住、移動、鬆開等多種與使用者互動事件,只需要實現他們的函式介面便能實現對應效果,而且種類很多,讀者可以試一試。