這幾天在做捕魚達人遊戲時發現,當滑鼠點選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需要滑鼠點選判斷,那些不需要。