用惯了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);
}