Đồ họa Raycaster của Unity; Làm thế nào nó hoạt động?


8

Tôi đang làm một trò chơi nhỏ lần đầu tiên và tận hưởng nó cho đến nay. Điều duy nhất khiến tôi bận tâm là tôi không thể tìm thấy lời giải thích của con người về những gì các raycaster đồ họa làm. Mặt nạ chặn là gì, các đối tượng chặn là gì? Tôi có nên che dấu những thứ tôi muốn nhấp hay những thứ tôi không muốn nhấp?

Để làm ví dụ tôi có ảnh chụp màn hình sau: http://i.imgur.com/6nkVY7b.png

Lớp phủCanvas có hình vuông màu hồng ở trên cùng và nút "Nút" trên hình vuông màu hồng. Tuy nhiên, toàn bộ khung vẽ đẫm máu có thể nhấp thay vì chỉ nút và hình vuông màu hồng. Điều đó có nghĩa là tất cả các tương tác bị thu giữ vì khung vẽ nằm trên "topLayer" có camera riêng.

Nút Square + trong lớp phủCanvas cũng nằm trên "topLayer". Nhưng tôi chỉ muốn nút và hình vuông màu hồng (và những gì trong đó) có thể nhấp được vì trò chơi đang dựa vào các nhấp chuột trên hình nền.

Câu trả lời:


18

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 đó, GraphicRaycasterban đầ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 Triggervà 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 MonoBehaviourcó 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...Handlergiao diện giống như IBeginDragHandlergiao 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 GraphicRaycasters 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 Raycasthà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);

resultsbâ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.