文章目錄
- UGUI事件處理流程
- 自定義圖片組件
- 自定義組件
- 總結
UGUI事件處理流程
-
EventSystem每幀呼叫BaseInputModule中的Process方法,
(實作類:StandaloneInputModule / TouchInputModule) -
計算游標接觸的物體(Graphic),
- Process方法呼叫BaseRaycaster的Raycast方法獲取所有Graphic,
(實作類:GraphicRaycaster / PhysicsRaycaster / Physics2DRaycaster) - 通過Graphic的 IsRaycastLocationValid方法確定游標選中的Graphic,
- Process方法呼叫BaseRaycaster的Raycast方法獲取所有Graphic,
-
通過ExecuteEvents引發物體的相關事件,
- 呼叫Execute方法獲取相關介面型別物件,再呼叫其介面方法,
什么是EventSystem?每次創建UGUI,編輯器都會自動創建一個EvenetSystem節點,該節點下掛載了一個EventSystem組件和一個Standalone Input Module組件,UGUI的事件源頭就是這個EventSystem類,而Standalone Input Module是EventSystem的子類,系統呼叫EventSystem的Update時通過多型訪問子類Standalone Input Module的功能,
什么是Graphic? Image、Text等需要渲染到螢屏上的物體都是Graphic的子類,值得注意的是,Button并不是Graphic的子類,因為Unity在計算Input時考慮的是實際渲染到螢屏上的物體,所以真正產生輸入的是Button上的圖片Image和文字Text,
Graphic Raycaster畫布中有一個默認組件是Graphic Raycaster(圖形射線檢測器),該組件使得畫布中被射線指定的物體能夠被檢測到(通過IsRaycastLocationValid方法實作),同理,當一個物體被放到畫布外面時,其射線檢測也將會失效,
IsRaycastLocationValid是用來判斷物體是否被射線選中的,該方法可以被重寫,因為其本身是一個虛方法,
自定義圖片組件
在游戲中經常會遇到使用不規則圖形作為按鈕的情況,比如地圖磁區點擊,下面通過實體來定義一個類似的組件,
自定義組件
首先在腳本中添加一個MapImage組件,

內容如下:
using UnityEngine;
using UnityEngine.UI;
namespace y7play
{
/// <summary>
/// 自定義地圖組件
/// </summary>
public class MapImage : Image
{
/// <summary>
/// 重寫射線檢測方法
/// </summary>
/// <param name="screenPoint"></param>
/// <param name="eventCamera"></param>
/// <returns></returns>
public override bool IsRaycastLocationValid(Vector2 screenPoint, Camera eventCamera)
{
return GetComponent<PolygonCollider2D>().OverlapPoint(screenPoint);
}
}
}
創建一個Button,并將Button中原有的Image組件換成我們的MapImage組件:

給Button添加一個Polygon Collider 2D組件:

通過編輯模式畫一張地圖(繪畫功底有限,簡單做個示例):

編輯結束后關閉編輯模式,運行游戲進行測驗,此時,當我們點擊綠色框線時就會觸發按鈕事件,而點擊綠色框線外的區域時則不會觸發,
總結
通過這種方法,我們可以制作更復雜的按鈕,比如我們可以提供多個碰撞器,或者自己寫一套演算法,來判斷什么情況下可以被選中,
更多內容請查看總目錄【Unity】Unity學習筆記目錄整理
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/325854.html
標籤:其他
