天天看點

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需要滑鼠點選判斷,那些不需要。