2016年2月16日星期二

[Unity3D] Unity觸控指令問題:我在移動呀~不是按下了呀~

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:  取消追蹤觸控點




好了那我先入正題,代碼奉上:

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,但現在情況好太多了!希望對大家也有幫助!

沒有留言:

發佈留言