EventSystem.current.IsPointerOverGameObject()方法,作用:判斷點擊是否點擊在UI上。

這幾天在做捕魚達人遊戲時發現,當鼠標點擊UI時,炮臺的子彈也會發射子彈,這樣會影響用戶體驗。

然後網上百度了一波,發現在UGUI系統上,的EventSystem提供了一些方法。

那就是EventSystem.current.IsPointerOverGameObject()方法,作用:判斷鼠標是否點擊在UI上。

因此,我們可以在開火前做一個判斷

在窗口端進行判斷時使用:

if(Input.GetMouseButtonDown(0)&&!EventSystem.current.IsPointerOverGameObject())

{

//生成子彈

}

在Android的段運行時使用:

if(Input.touchCount> 0 && Input.GetTouch(0).phase == TouchPhase.Began)//手指按下並且觸點大於0
 {
     if(!EventSystem.current.IsPointerOverGameObject(Input.GetTouch(0).fingerId ))//沒點到UI
        {
         }

}

 

一: 下面先說經常用的三個事件  手指按下、手指移動、手指鬆開
1.  手指按下

if(input.touchCount==1)
{
   if(input.touches[0].phase==TouchPhase.Beagn)
   {
          // 手指按下時,要觸發的代碼
   }

2.  手指在屏幕上滑動
if(input.touchCount==1)
{  
     if(input.touches[0].phase==TouchPhase.Move)  
     {         
           // 手指滑動時,要觸發的代碼 
          float s01=Input.getAxis("Mouse X");    //手指水平移動的距離
          float s02=Input.getAxis("Mouse Y");    //手指垂直移動的距離
     }​​​​​​​

3.  手指在屏幕上鬆開時
​   if(input.touches[0].phase==TouchPhase.Ended)&&                        Input.touches[0].phase!=TouchPhase.Canceled  ​​

二: 上面介紹的是單手指觸發事件,下面介紹的是多手指觸發事件
if(touchCount==2)   //代表有兩個手指
{
   if(Input.getTouch(0).phase==TouchPhase.Moved&&    //第一個手指                  Input.getTouch(1).phase==TouchPhase.Moved)            //第二個手指
    {
          vecter3 s1=input.getTouch(0).position;         //第一個手指屏幕座標
          vecter3 s2=input.getTouch(1).position;         //第二個手指屏幕座標
          newdis=Vecter2.distance(s1,s2);
          if(newdis>olddis)             //手勢外拉
          { 
                distance+=Time.deltaTime*50f;
          }
          if(newdis
          {
                distance-=Time.deltaTime*50f;
          }
         olddis=newdis;
    }
}
​​​​​​​​​​​​​​
總結:
1.  不管是觸屏事件還是PC端的事件,世界轉屏幕還是屏幕轉世界以及射線檢測都是管用的
2.  安卓端的手指座標(Input.touches[0].position)等同於PC端的鼠標屏幕座標
(Input.mousePosition)

這樣就行了。但是!但是!結果運行起來,點擊UI是無法生成子彈,這是實現了,可是點擊沒有UI的地方卻無法生成子彈,這就令人很崩潰了!

原來在我們的背景圖上,它也是一個UI Image,那這樣這個判斷是否點擊UI上的方法豈不是實現不了?

但是EventSystem貌似早就爲我們想好了。在圖像組件上的有一個Raycast Type的複選框,只要我們把勾選去掉,就行了。

因此我推測EventSystem.current.IsPointerOverGameObject()方法的原理是,是根據UI上的Raycast Target的勾選來遍歷,那些UI需要鼠標點擊判斷,那些不需要。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章