記一次Selectable的誤用
阿新 • • 發佈:2018-11-25
#### 記一次Selectable的誤用
記一次selectable的誤用,現有個UI層級結構如下圖所示:
其在場景中位置如下所示,可以看到Button是Panel的子物體,開始時Button是隱藏的,並且他們處於不同的位置:
將這樣的一個指令碼掛在Panel上面,Button序列化為Panel的子物體Button
:
------------------------------------------
現場還原完畢,此時點選Panel,Button會顯示出來,當Button顯示出來後點擊Button,Button永遠不會觸發相應OnClick
事件,Console也永遠不會有print
因為不太清楚,UGUI的事件是怎麼派發的,按我的猜測:當Button被點選後,因為
Button
繼承自Selectable
,此時神奇的事發生了,事件處理系統並沒有優先派發Button的OnPointerClick,而是優先呼叫了Panel的OnDeselect(),因為Button也是一個Selectable
,當一個Selectable
被Select
時,EventSystem
總會先呼叫先前選中的Selectable的OnDeselect()函式,這個可以在Selectable
的原始碼中瞭解到,然後呼叫後Button就被隱藏了,然後莫名的Button的點選事件又被傳遞到了Panel上所以在整個過程中看到的是:Buton一直顯示著,但是Button的事件永遠沒用被觸發.在我看來這是一次
Selectable
的誤用,檢視Selectable的原始碼,Selectable主要也是實現了GameObject被選中後的視覺變化.不應該同時使用Select的OnSelect
和OnDeselect
,尤其是在上述的Selectable
的物體上掛著另一個Selectable
,並且用介面控制其子物體顯隱時.