Was ist ein Raycast? Was sind blockierende Objekte und blockierende Masken?
Ein Strahl ist ein mathematisches Gerät, das an einem Ursprungspunkt beginnt und sich für immer in einer bestimmten Richtung fortsetzt. Mit einem Raycast werfen Sie einen Strahl, der wie das Wort werfen verwendet wird. Es ist, als würde man einen Stein werfen und er würde für immer in diese Richtung weitergehen. Er würde nicht aufhören, bis er etwas trifft. Sie sind interessiert, ob es ein Objekt getroffen hat und was dieses Objekt war.
Das Blockieren von Objekten sind die Objekte, die Sie speziell für Ihren Raycast definieren, um sie treffen zu können.
Mit einer Blockierungsmaske können Sie, anstatt Tonnen von Blockierungsobjekten zu übergeben, die Ebenen in Unity definieren, die Ihr Raycast in Form eines treffen sollBitmaske . Die Bitmaske ist so codiert, dass jedes Bit eine Schicht darstellt. Wenn Ihre Bitmaske 0000000000000101
als (1 | 1<<2)
oder 5
dargestellt wurde, wird Ihr Raycast nur von den Ebenen 1 und 3 blockiert und kann daher nur Objekte in diesen Ebenen treffen.
Wenn wir uns die Raycasters-Dokumentation von Unity ansehen , sehen wir, dass es drei verschiedene Arten von Raycastern gibt
Graphic Raycaster - Wird für UI-Elemente verwendet, lebt auf einer Leinwand und. sucht innerhalb der Leinwand
Physik 2D Raycaster - Wird für 2D- Physikelemente verwendet.
Physics Raycaster - Wird für 3D- Physikelemente verwendet.
Entsprechend Andy Borrell im Oculus Blog
der GraphicRaycaster (für Leinwände) und der PhysicsRaycaster (für Physikobjekte).
Das, was uns hier interessiert, ist Graphic Raycaster und dementsprechend Unity
Der Graphic Raycaster wird zum Raycasting gegen eine Leinwand verwendet. Der Raycaster betrachtet alle Grafiken auf der Leinwand und stellt fest, ob eine davon getroffen wurde.
Grafik Raycaster und Unity Event - System
Unity GraphicRaycaster wurden in Version 4.6 zusammen mit einer Reihe anderer Dinge eingeführt , die alle Teile der Einheit der neuen Ereignis System sind. Aus diesem Grund sollte das GraphicRaycaster
ursprünglich über dieses System verwendet werden (genau wie der Physics Raycaster und sein 2D-Gegenstück, die sich alle von Physics.Raycast
denen unterscheiden, die für generische Raycasts gedacht sind, die nicht unbedingt aus UI-Ereignissen stammen). Es gibt zwei Optionen für die Verwendung dieser Komponente in Unity.
Wenn Sie mit Unitys EventSystem den vollen Weg nach Unity gehen möchten , müssen Sie einen in Ihre Szene einfügen . Sie finden dies unter GameObject > UI > Event System
. Von hier aus haben Sie einige Methoden, um das Ereignis zu erfassen und nach Ihrem Willen zu verwenden.
- Verwenden Sie Ereignisauslöser (im
Component > Event > Event Trigger
und verwenden Sie den Editor, um alle Ihre Verbindungen zu erstellen.
- Wenn Sie den Editor vermeiden möchten,
MonoBehaviour
können Sie abhängig vom Ereignis, das Sie erfassen möchten, eine bestimmte Schnittstelle implementieren. Dies sind die UnityEngine.EventSystems.I...Handler
Schnittstellen wie die IBeginDragHandler
Schnittstelle
Dieses Video zeigt die spezifischen Implementierungen jeder Methode.
Weitere Informationen zum Ereignissystem, zu Triggern und zur Zusammenarbeit finden Sie in diesem Video .
Sie können auch direkt verwenden , indem Sie den Aufruf GraphicRaycaster
s Raycast Funktion selbst statt der Schaffung Code als Reaktion auf ein Ereignis. Dazu benötigen wir den folgenden Codeausschnitt, in dem wir ein PointerEventData
Objekt erstellen , das an die Raycast
Funktion gesendet werden soll.
//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
enthält jetzt alle Ihre getroffenen Canvas-Objekte. Dies ist fast die gleiche Art und WeisePointerInputModule
wie beim Raycasting mit EventSystem.RaycastAll in Unity (außer mit mehr Caching).
Ihr spezifisches Problem mit der Schaltfläche.
Versuchen Sie, die OverlayCanvas so einzustellen, dass sie sich nicht auf einer Ebene befinden. Ich denke, die Tatsache, dass es sich in erster Linie auf einer Ebene befindet, könnte die Dinge zerstören, da es so aussieht, als ob die Standardeinstellung für einen Graphic Caster durch "Alles" blockiert wird, auf das Ihre BGCanvas vermutlich die Blockierungsmaske eingestellt hat.