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


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;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM