1. 什么是PhysicsRaycaster組件?
PhysicsRaycaster是Unity UGUI中的一個組件,用于在UI元素上進行物理射線檢測。它可以檢測鼠標或觸摸事件是否發生在UI元素上,并將事件傳遞給相應的UI元素。
2. PhysicsRaycaster的工作原理
PhysicsRaycaster通過發射一條射線來檢測UI元素。當射線與UI元素相交時,PhysicsRaycaster會將事件傳遞給相應的UI元素。
3. PhysicsRaycaster的常用屬性
- Event Mask:指定哪些層的UI元素可以接收事件。
- Max Raycast Distance:指定射線的最大檢測距離。
4. PhysicsRaycaster的常用函數
- Raycast:發射一條射線并返回與之相交的UI元素。
5. 完整例子代碼
例子1:點擊按鈕改變顏色
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class ButtonColorChanger : MonoBehaviour, IPointerClickHandler
{private Image image;private void Start(){image = GetComponent<Image>();}public void OnPointerClick(PointerEventData eventData){image.color = Random.ColorHSV();}
}
操作步驟:
- 創建一個Canvas對象,并在Canvas下創建一個Button對象。
- 將Button對象的Image組件的Color屬性設置為任意顏色。
- 將Button對象的PhysicsRaycaster組件的Event Mask屬性設置為默認值。
- 將Button對象的ButtonColorChanger腳本掛載到Button對象上。
- 運行游戲,點擊Button對象,顏色會隨機改變。
注意事項:
- 需要在Canvas對象上添加一個Graphics Raycaster組件,以便PhysicsRaycaster能夠工作。
例子2:拖拽物體?
using UnityEngine;
using UnityEngine.EventSystems;public class ObjectDragger : MonoBehaviour, IPointerDownHandler, IDragHandler
{private RectTransform rectTransform;private void Start(){rectTransform = GetComponent<RectTransform>();}public void OnPointerDown(PointerEventData eventData){rectTransform.SetAsLastSibling();}public void OnDrag(PointerEventData eventData){rectTransform.anchoredPosition += eventData.delta;}
}
?
操作步驟:
- 創建一個Canvas對象,并在Canvas下創建一個Image對象。
- 將Image對象的PhysicsRaycaster組件的Event Mask屬性設置為默認值。
- 將Image對象的ObjectDragger腳本掛載到Image對象上。
- 運行游戲,點擊Image對象并拖動,Image對象會跟隨鼠標或觸摸移動。
注意事項:
- 需要在Canvas對象上添加一個Graphics Raycaster組件,以便PhysicsRaycaster能夠工作。
例子3:點擊按鈕播放音效?
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;public class ButtonSoundPlayer : MonoBehaviour, IPointerClickHandler
{public AudioClip soundClip;private Button button;private AudioSource audioSource;private void Start(){button = GetComponent<Button>();audioSource = GetComponent<AudioSource>();audioSource.clip = soundClip;}public void OnPointerClick(PointerEventData eventData){audioSource.Play();}
}
?
操作步驟:
- 創建一個Canvas對象,并在Canvas下創建一個Button對象。
- 將Button對象的PhysicsRaycaster組件的Event Mask屬性設置為默認值。
- 在場景中添加一個AudioSource對象,并將音效文件拖拽到ButtonSoundPlayer腳本的soundClip屬性上。
- 將Button對象的ButtonSoundPlayer腳本掛載到Button對象上。
- 運行游戲,點擊Button對象,音效會播放。
注意事項:
- 需要在Canvas對象上添加一個Graphics Raycaster組件,以便PhysicsRaycaster能夠工作。?
順便介紹一下幾個其他的組件
1.Graphic Raycaster?
?主要用于UI上的射線檢測,掛有這個組件的物體,必須要掛上Canvas這個組件(當掛上Graphic Raycaster時Canvas也會自動掛上)。
Ignore Reversed Graphics:是否忽略反方向的圖形,如果為true,則表示圖形正面展示時,會接收到射線檢測;反面展示時,不會接收到射線檢測;否則,正反面展示都會接收到射線檢測
Blocking Objects:屏蔽指定類型的(物理)對象,使它們不參與射線檢測。渲染模式不為ScreenSpaceOverlay時起作用。可選值為:
None:不屏蔽任何物理對象
Two D:屏蔽2D物理對象(即具有2D碰撞體的對象)
Three D:屏蔽3D物理對象(即具有3D碰撞體的對象)
All:屏蔽所有物體對象
Blocking Mask:使屏蔽對象中的指定層不參與射線檢測。渲染模式不為ScreenSpaceOverlay時,且Blocking Objects不為None時起作用。
例如,Blocking Objects為2D,Blocking Mask為UI,指2D物理對象中是UI層的東西都不會接收射線檢測,而2D物理對象中的其他層還是能接收射線檢測
?3.Selectable
Selectable的意思是可選擇的,它是UGUI中很多交互控件(Button/ Slider / InputField / Toggle / Scrollbar /)的基類,其中的Interactable,當值為false時,UI控件會進入disable狀態(顏色會變為Disabled Color的那個顏色),但是UI控件仍然能接收到射線檢測!
CanvasGroup
?用來批量地管理該控件以及該控件下的UI控件。Interactable的意思上面已經說到,而Blocks Raycasts,若為false,則UI控件不能接收射線檢測
射線穿透:
如上圖,button和image都實現了點擊接口,如果想點擊兩者的重疊部分,button的事件沒有觸發,而image的事件觸發了,方法就是:
給button掛上Canvas Group組件,然后不勾選Blocks Raycasts。