用慣了NGUI的EventListener寫按鈕監聽,所以也想在UGUI里用同樣的方式進行按鈕監聽。看了網上的方式用EventTrigger重寫了控件的各個事件,發現了個問題,就是在控件的Interactable屬性為false的情況下依舊響應事件,網上也沒搜到什么辦法,結果折騰了半天發現這個問題其實很好解決。
兩個辦法:
- 在禁用按鈕時也禁用控件Image的Raycast Target。
gameObject.GetComponent<Image>().raycastTarget = false;
gameObject.GetComponent<Button>().interactable = false;
- 如果不想禁用Raycast Target就只能在重寫的方法或實現接口中判斷當前點擊物體身上可交互組件的Interactable值。
public void OnPointerClick(PointerEventData eventData)
{
Button temp = GetComponent<Button>();
if (onClick != null && temp.interactable) onClick(gameObject);
}
由于可交互組件不只有Button,可能需要再判斷前先判斷物體上的交互組件是什么,比如:
public void OnPointerClick(PointerEventData eventData)
{
Selectable temp = eventData.pointerPress.GetComponent<Selectable>() != null ?
eventData.pointerPress.GetComponent<Selectable>() : eventData.pointerPress.GetComponent<Button>() as Selectable != null ?
eventData.pointerPress.GetComponent<Button>() as Selectable : eventData.pointerPress.GetComponent<Toggle>() as Selectable != null ?
eventData.pointerPress.GetComponent<Toggle>() as Selectable : null;
if (temp == null) return;
if (onClick != null && temp.interactable) onClick(gameObject);
}