1. 程式人生 > >unity UI如何開啟(顯示)或者關閉(隱藏)Panel界面最好?

unity UI如何開啟(顯示)或者關閉(隱藏)Panel界面最好?

component scale space 嚴重 新增 cti draw call 設計理念 耦合

https://segmentfault.com/a/1190000012357091

unity UI如何開啟(顯示)或者關閉(隱藏)Panel界面,相信大家都是知道的,但是如何做最好呢?

可能大家一般開啟/關閉界面的方法就是直接SetActive吧。這樣做通常是可以的,簡答快速地解決需求,但是它又兩個問題:
第一,Disable掉的物體上面的腳本也不運行了,而很多時候我們需要那個腳本運行。這樣就不能用掛在自己身上腳本把自己SetActive(true)或者SetActive(false)。如果把自己的引用給另外一個腳本來對自己SetActive(true)或者SetActive(false),又會造成多余的耦合,並不符合OOP設計理念。

第二,Disable掉的物體,重新SetActive(true),會造成較大的性能消耗,如果此界面draw call較多,會有明顯的延遲。

不用SetActive(true)/(false)之後,我們還有什麽其他方法解決問題嗎?

以下是大家可能想到的其他方法,它們也各有各的問題:

方法:Scale改為0,0,0,再改為1,1,1;
問題:改回後draw call加倍;大量垃圾回收;

方法:將界面移除Canvas這個父物體;
問題:改回後draw call加倍;大量垃圾回收;而且新增父物體增加額外引用耦合;

方法:放在Camera的某個culling層上;
問題:改回後draw call加倍;大量垃圾回收;只對screen space-camera有效;

方法:Canvas.enable = false;
問題:改回後延遲嚴重;而且不方便使用;

這些都不好,那你說,什麽方法可行呢?

這個解決方法就是給Panel加一個CanvasGroup,上面提到的問題,在它身上都不會發生;

若要顯示:

GetComponent<CanvasGroup>().alpha = 1;
GetComponent<CanvasGroup>().interactable = true;
GetComponent<CanvasGroup>().blocksRaycasts = true;

若要隱藏:

GetComponent<CanvasGroup>().alpha = 0;

GetComponent<CanvasGroup>().interactable = false;
GetComponent<CanvasGroup>().blocksRaycasts = false;

unity UI如何開啟(顯示)或者關閉(隱藏)Panel界面最好?