Tia là gì? Chặn các đối tượng và mặt nạ chặn là gì?
Một ray là một thiết bị toán học bắt đầu từ một điểm gốc và tiếp tục trên theo một hướng cụ thể mãi mãi. Với một raycast bạn đang truyền một tia, cast được sử dụng như từ ném. Giống như nếu bạn ném một hòn đá và nó cứ tiếp tục theo hướng đó mãi mãi, nó sẽ không dừng lại cho đến khi nó va phải thứ gì đó. Bạn quan tâm đến việc liệu nó có đánh vào một vật thể hay không và vật thể đó là gì.
Chặn các đối tượng sẽ là các đối tượng mà bạn xác định cụ thể raycast của mình để có thể đánh.
Một mặt nạ chặn cho phép bạn, thay vì đi qua tấn của các đối tượng chặn, xác định các lớp trong Unity bạn muốn raycast của bạn để có thể đạt dưới hình thức mộtbitmask . Bitmask được mã hóa để mỗi bit đại diện cho một lớp. Nếu bitmask của bạn được 0000000000000101
đại diện là (1 | 1<<2)
hoặc5
sau đó raycast của bạn sẽ chỉ bị chặn bởi các lớp 1 và 3 và do đó chỉ có thể đánh các đối tượng trong các lớp đó.
Nếu chúng ta xem tài liệu Raycasters của Unity , chúng ta có thể thấy có ba loại máy phát sóng khác nhau
Đồ họa Raycaster - Được sử dụng cho các thành phần UI, sống trên Canvas và. tìm kiếm trong khung vẽ
Vật lý 2D Raycaster - Được sử dụng cho các yếu tố vật lý 2D.
Vật lý Raycaster - Được sử dụng cho các yếu tố vật lý 3D.
Theo Andy Borrell trong blog Oculus
GraphicRaycaster (cho Canvases) và ChemistryRaycaster (cho các đối tượng vật lý).
Thứ chúng tôi quan tâm ở đây là Đồ họa Raycaster và theo Unity
Đồ họa Raycaster được sử dụng để phát sóng trên Canvas. Raycaster nhìn vào tất cả Đồ họa trên khung vẽ và xác định xem có bất kỳ đồ họa nào trong số chúng đã bị tấn công không.
Graphic Raycaster và Unity's System System
Unity's GraphicRaycaster đã được giới thiệu trong phiên bản 4.6 cùng với một loạt các thứ khác, tất cả đều thuộc hệ thống sự kiện mới của Unity. Vì lý do đó, GraphicRaycaster
ban đầu được sử dụng thông qua hệ thống này (giống với Vật lý Raycaster và đối tác 2D của nó, tất cả đều khác với Physics.Raycast
ý nghĩa của các phát sóng chung không nhất thiết phải bắt nguồn từ các sự kiện UI). Có hai tùy chọn cho việc sử dụng thành phần này trong Unity.
Nếu bạn muốn thực hiện đầy đủ theo cách của Unity bằng cách sử dụng EventSystem của Unity , bạn sẽ cần đặt một cảnh trong cảnh của mình. Bạn có thể tìm thấy điều này dưới GameObject > UI > Event System
. Từ đây bạn có một vài phương pháp để nắm bắt sự kiện và sử dụng nó theo ý muốn của bạn.
- Sử dụng trình kích hoạt sự kiện (được tìm thấy
Component > Event > Event Trigger
và sử dụng trình chỉnh sửa để tạo tất cả các kết nối của bạn.
- Nếu bạn muốn tránh trình chỉnh sửa, bạn
MonoBehaviour
có thể triển khai một giao diện cụ thể tùy thuộc vào sự kiện bạn muốn chụp. Đây là những UnityEngine.EventSystems.I...Handler
giao diện giống như IBeginDragHandler
giao diện
Video này cho thấy các triển khai cụ thể của từng phương pháp.
Để biết thêm về hệ thống sự kiện, các trình kích hoạt và cách tất cả chúng hoạt động cùng nhau , video này cũng có thể giúp ích.
Bạn cũng có thể sử dụng nó trực tiếp bằng cách gọi GraphicRaycaster
s Raycast chức năng riêng của mình thay vì tạo mã như một phản ứng với một sự kiện. Để làm điều này, chúng ta cần đoạn mã sau đây nơi chúng ta tạo một PointerEventData
đối tượng để gửi đến Raycast
hàm.
//Code to be place in a MonoBehaviour with a GraphicRaycaster component
GraphicRaycaster gr = this.GetComponent<GraphicRaycaster>();
//Create the PointerEventData with null for the EventSystem
PointerEventData ped = new PointerEventData(null);
//Set required parameters, in this case, mouse position
ped.position = Input.mousePosition;
//Create list to receive all results
List<RaycastResult> results = new List<RaycastResult>();
//Raycast it
gr.Raycast(ped, results);
results
bây giờ sẽ chứa tất cả các đối tượng canvas nhấn của bạn. Điều này khá giống với cách phátPointerInputModule
sóng với EventSystem.Raycast ALL in Unity (ngoại trừ có thêm bộ nhớ đệm).
Vấn đề cụ thể của bạn với nút.
Hãy thử đặt OverlayCanvas không nằm trên một lớp. Tôi nghĩ rằng thực tế là nó ở trên một lớp ở nơi đầu tiên có thể phá vỡ mọi thứ bởi vì có vẻ như mặc định cho Trình vẽ đồ họa sẽ bị chặn bởi "Mọi thứ" mà tôi đoán BGCanvas của bạn đã đặt mặt nạ chặn.