Unity有一個Touch的類別是用來控制手機或是平板電腦的觸控指令,裏頭有一個TouchPhase.Moved 和 TouchPhase.Stationary的狀態,顧名思義Moved是指觸控點在移動,Stationary是在按下不動,但是......
我明明在移動呀!你把我當成按下了!
本來的代碼跟效果圖如下:
代碼部份:這是在Updates裏,我有一個Boolean _clicking, 如果是按下了才會出現紅點
_touches = Input.touches;
if(_touches.Length == 1)
{
if(_touches[0].phase == TouchPhase.Stationary)
{
Debug.Log("Clicked, 紅點出現");
_clicking = true;
}
else
{
Debug.Log("Moving, 沒有紅點");
_clicking = false;
}
}
看代碼我想不會有問題吧?於是我就運行試試看:
結論是:我在移動呀~不是按下了呀~雖然我就乖乖找 Google跟 Facebook的大大求救,然後試驗到其中一個可行的方法!
就是用Touch的deltaPosition,設定一個小小的範團移動也算Stationary!
我們首先認識一下Unity的Touch有甚麼常用的變量:
position: 觸控點的座標 (Vector2)
deltaPosition: 觸控點的座標變化量 (Vector2)
deltaTime: 觸控點的時間長度 (floot)
Phase:
觸控點的狀態,共有五個
- Began: 觸控點開始移動時
- Moved: 觸控點移動中
- Stationary: 觸控點按著不移
- Ended: 手指離開螢幕
- Canceled: 取消追蹤觸控點
詳情可以參考它的API: http://docs.unity3d.com/ScriptReference/Touch.html
好了那我先入正題,代碼奉上:
if (_touches.Length == 1){
_touchPosition = _touches[0].
Debug.Log("touch.deltaPosition: " + _touchPosition);
if(_touches[0].phase == TouchPhase.Ended)
{
if(_touches[0].phase == TouchPhase.Stationary || _touchPosition < 2f)
{
Debug.Log("Clicked");
_clicking = true;
}
else
_clicking = false;
}
在Console下的Debug.log如下:
就記錄了我移動手指和我只是按下螢幕不動
新的代碼加了兩樣很重要的東西:deltaPosition 和 TouchPhase.Ended
deltaPosition是只要觸碰螢幕就記錄其變化量,其實觸碰螢幕到拉動手指之間的時間也在被記下來(就是圖中的touch.delta.Position: 0),但是你手指還在螢幕所以還沒有到 TouchPhase.Ended,所以之後的事情沒有被觸發,所以第一次沒有Clicked顯示出來。
第二次我只是按下螢幕不動,所以 touch.delta.Position在手指離開螢幕時一直是0,之後在觸發下面的事情所以Clicked顯示出來了。
然後要做的就是慢慢調整 _touchPosition,多少的移動範圍你也算Stationary。不過偶然還是會把我當成Stationary而不是Moved,但現在情況好太多了!希望對大家也有幫助!
沒有留言:
發佈留言