1. 程式人生 > >記一次Selectable的誤用

記一次Selectable的誤用

#### 記一次Selectable的誤用

記一次selectable的誤用,現有個UI層級結構如下圖所示:
UI層級
其在場景中位置如下所示,可以看到Button是Panel的子物體,開始時Button是隱藏的,並且他們處於不同的位置:
場景位置
將這樣的一個指令碼掛在Panel上面,Button序列化為Panel的子物體Button:
img
------------------------------------------
現場還原完畢,此時點選Panel,Button會顯示出來,當Button顯示出來後點擊Button,Button永遠不會觸發相應OnClick事件,Console也永遠不會有print

的輸出,通過檢視EventSystem可以看到,當前選擇的GameObject,永遠是Panel.這是怎麼一回事呢?
因為不太清楚,UGUI的事件是怎麼派發的,按我的猜測:當Button被點選後,因為Button繼承自Selectable,此時神奇的事發生了,事件處理系統並沒有優先派發Button的OnPointerClick,而是優先呼叫了Panel的OnDeselect(),因為Button也是一個Selectable,當一個SelectableSelect時,EventSystem總會先呼叫先前選中的Selectable的OnDeselect()函式,這個可以在Selectable的原始碼中瞭解到,然後呼叫後Button就被隱藏了,然後莫名的Button的點選事件又被傳遞到了Panel上
,Panel的OnSelect()被呼叫,Buton又被顯示了出來.
所以在整個過程中看到的是:Buton一直顯示著,但是Button的事件永遠沒用被觸發.在我看來這是一次Selectable的誤用,檢視Selectable的原始碼,Selectable主要也是實現了GameObject被選中後的視覺變化.不應該同時使用Select的OnSelectOnDeselect,尤其是在上述的Selectable的物體上掛著另一個Selectable,並且用介面控制其子物體顯隱時.