CanvasGroup是Unity中用于控制UI的透明度、交互性和渲染順序的組件。
一、常用屬性的解釋
1、alpha:控制UI的透明度
類型:float,0.0 ~1.0,
其中 0.0 完全透明,1.0 完全不透明。
通過調整alpha值可以實現UI的淡入淡出效果,可以參考本人的另一篇文章:
Unity功能——設置提示面板的顯示與掩藏
2、blocksRaycasts:控制UI是否阻擋射線(Raycasts)
(1)類型:bool,true/false,
(2)true時會阻擋射線,false時不會阻擋射線。
(3)用戶不對該UI后面的UI進行射線檢測,可將值設置為true;
3、interactable:控制UI是否可交互(如點擊、拖動等)
(1)類型:bool,true/false,
(2)true時會響應用戶輸入,false時將忽略用戶輸入。
(3)用戶不對該UI進行交互,可將值設置為false;
4、ignoreParentGroups:控制UI是否忽略父級CanvasGroup的設置
(1)類型:bool,true/false,
(2)true時將忽略其父級CanvasGroup的alpha和interactable設置,false時會受到父級CanvasGroup的設置影響。
(3)用戶要獨立控制UI的透明度和交互性,可將值設置為true;
二、組件的alpha屬性和UI的alpha屬性的異同
1、相同點:
在視覺上是一樣的,都可控制UI能不能被用戶看到,也僅是控制物體的不透明度;
在交互上,都不會影響UI的交互性,都可正常進行交互事件;
在射線檢測上,也都不會改變UI對射線的阻擋特性;
2、不同點:
(1)作用范圍不同
直接設置 UI 元素的alpha值,只會影響該單個UI元素的透明度,其父子元素不會受到影響。
而CanvasGroup組件可以控制其所在UI及其所有子對象的透明度。組件所在的UI對象以及它包含的所有子物體(如按鈕、文本框等)都會統一改變透明度。
(2)性能影響不同
直接設置單個UI的alpha值,性能開銷相對較小,因為只涉及到對單個對象的屬性修改。
當使用CanvasGroup時,會影響多個子對象,Unity需要處理更多的渲染和交互狀態更新,
性能開銷相對較大,尤其是在子對象數量較多的情況下。不過,在大多數正常場景下,這種開銷通常是可以接受的。
三、組件的alpha屬性和UI的visible屬性的異同
1、相同點:
在視覺上是一樣的,都可控制UI能不能被用戶看到;
2、不同點:
(1)直接設置UI的visible值為false后,UI將完全不響應任何事件;
因為visible為false,背包及其內部子物體都不會被渲染出來,更不會被交互;
(2)而通過設置CanvasGroup組件的alpha值,只是影響視覺效果,不影響事件交互。
故即使aplha值為0,對UI及其子物體的拖拽移動,修改等任何事件都會正常執行?。
四、(重點)blocksRaycasts和interactable之間的區別和使用場景
下面提到的自身,包括掛載組件的UI以及UI內部的其他子對象。
1、異同
相同:都會影響UI自身的交互;
不同:
Interactable是影響(自身的)輸入事件,影響交互狀態;
BlocksRaycasts是影響(自身和自身以外后面的UI的)射線事件,影響射線檢測狀態。
2、使用環境
以背包面板為例,
(1)狀態說明如下:
1)僅背包上掛載CanvasGroup組件;
2)可通過鍵盤輸入事件,往背包內部物品格里增減物品;
3)背包、物品格里的物品、背包后面的物品X都能進行鼠標點擊移動操作時,
4)點擊重疊處,通常會優先處理最上層的元素:物品>物品格>背包>物品X;
4)由于背包的visible值為false,完全不響應任何事件,
而CanvasGroup組件的alpha值只影響視覺效果,不影響任何用戶事件。
若visible為false,無論CanvasGroup設置什么樣,物體X怎么也不會被背包遮擋,能被射線檢測到,可被鼠標拖動。
故這里默認背包的visible值為true,通過CanvasGroup的alpha值控制背包顯示掩藏。
(2)情況分析:
1)Interactable為true,BlocksRaycasts為true:
Interactable為true,
表示背包及子物體的交互事件可正常執行,鼠標鍵盤事件背包及子物體都可被接收。
blocksRaycasts為true:
在檢測鼠標點擊時,射線會首先命中背包面板,鼠標點擊事件會優先被背包面板接收并處理,而不會觸發后面物體 X 的點擊拖動事件。
無論alpha值是不是為0,背包面板是不是不可見,都會認為背包面板仍然存在并會阻擋射線,交互邏輯上優先響應背包面板:
故鼠標點擊背包/物品X:
背包面板可被鼠標拖動;背包里的物品也可以正常被鼠標移動;
也可正常通過鍵盤事件,往內部物品格里進行增減物品;
物體X被背包遮擋,不會被射線檢測到,無法被鼠標拖動;
2)Interactable為true,BlocksRaycasts為false:
interactable為true,
表明背包及其子元素,理論上可以接受交互事件;
但blocksRaycasts為false,
背包面板不會阻擋射線檢測,射線會直接穿透背包面板,命中其后面的物體X。
無論alpha值是不是為1,背包面板是不是可見,交互邏輯上只響應物體X的射線檢測事件,
不過鍵盤的事件不是由射線檢測判斷觸發,背包里的物品正常接收鍵盤事件;
故鼠標點擊背包/物品X:
背包面板不能被鼠標拖動;背包里的物品無法被鼠標移動;
但可正常通過鍵盤事件,往內部物品格里進行增減物品;
物體X不會被背包遮擋,可以被射線檢測到,被鼠標拖動;
3)Interactable為false,BlocksRaycasts為true:
blocksRaycasts為true
在檢測鼠標點擊時,射線會首先命中背包面板,鼠標點擊事件會優先被背包面板接收并處理,而不會觸發后面物體 X 的點擊拖動事件。
但Interactable為false
背包及其子元素的交互層面被設置為不可用狀態,背包上的任何交互事件都不會被接受觸發。
因此背包子物體的鍵盤事件不會被觸發;同時即使背包及其子物體接收了鼠標的射線檢測,也不會觸發鼠標事件。
故鼠標點擊背包/物品X:
背包面板不能被鼠標拖動;背包里的物品無法被鼠標移動;
通過鍵盤事件,也不能往內部物品格里進行增減物品;
物體X會被背包遮擋,不會被射線檢測到,無法被鼠標拖動;
4)Interactable為false,BlocksRaycasts為false:
blocksRaycasts為false
背包面板不會阻擋射線檢測,射線會直接穿透背包面板,命中其后面的物體X。交互邏輯上只響應物體X的射線檢測事件。
Interactable為false
背包及其子元素的交互層面被設置為不可用狀態,背包上的任何交互事件都不會被接受觸發。
因此背包和子物體的鼠標事件,以及子物體的鍵盤事件都不會被觸發。
故鼠標點擊背包/物品X:
背包面板不能被鼠標拖動;背包里的物品無法被鼠標移動;
通過鍵盤事件,也不能往內部物品格里進行增減物品;
物體X不會被背包遮擋,可以被射線檢測到,被鼠標拖動;