2015年12月2日星期三

[Unity3D]在UI介面不觸發遊戲畫面的物件(Blocking Clicks)

在弄一個類似回合制的遊戲,遊戲上有個uGUI介面(Render Mode為Screen Space Overlay), Canvas設定如圖:


和一個可以放大縮小的棋盤,按下棋盤的格會出現紅色的圓點。

可是棋盤放大時,當玩家想按UI介面的按鈕,會不小心同時觸發棋盤格(出現紅點):




我想處理的問題是按下UI介面(上方半透明的介面)不會觸發棋盤的功能。

然後謝謝Facebook Unity群組的大大提供了一個不錯的影片:
Unity UI - Blocking clicks
https://www.youtube.com/watch?v=EVZiv7DLU6E

影片提供了三個方法:
1. Event System Checking
20160516補充:之前有網友反映EventSystem.current.IsPointerOverGameObject()在Editor測試沒有問題但放在Android機就不行,然後小弟找到以下方法
using unityEngine.EventSystems; 
#if IPHONE || ANDROID
 if(EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId))
#else 
 if(EventSystem.current.IsPointerOverGameObject())
#endif 
{
  //棋盤的邏輯
}

參考至雨松大大:http://www.xuanyusong.com/archives/3327 
另外找到一個不錯的研究:http://blog.csdn.net/liqiangeastsun/article/details/46490041

2. Event Triggers
將Event Triggers放到Cube/棋盤格,然後Pointer Up,類似uGUI Button的OnClick,把想運行的方法加進去

然後在攝影機(Camera)加上Physics Ray caster

3. Event System Interface
加上PointerClickHandler這個interface然後把棋盤的邏輯放進下面的代碼裏:
public void OnPointerClick(PointerEventData eventData){ 
//棋盤的邏輯
}

然後在攝影機(Camera)加上Physics Ray caster

雖然影片中提及第三個方法就最好的,但是我還是用了第一個方法。因為我不想把棋盤的邏輯放進另一個Function(方法)裏,不然比較麻煩,所以最後用一個if-case把想做的事情包住就好了。