Grafik Raycaster der Einheit; Wie funktioniert es?

8

Ich mache zum ersten Mal ein kleines Spiel und genieße es bisher. Das einzige, was mich immer wieder stört, ist, dass ich keine menschliche Erklärung dafür finden kann, was der Grafik-Raycaster tut. Was ist die Sperrmaske, was sind die Sperrobjekte usw.? Soll ich die Dinge maskieren, auf die ich klicken möchte, oder die Dinge, auf die ich nicht klicken möchte?

Als Beispiel habe ich den folgenden Screenshot: http://i.imgur.com/6nkVY7b.png

Das OverlayCanvas hat das rosa Quadrat oben und den Knopf "Button" auf dem rosa Quadrat. Trotzdem kann die gesamte blutige Leinwand angeklickt werden, anstatt nur der Knopf und das rosa Quadrat. Dies bedeutet, dass alle Interaktionen erfasst werden, da sich die Leinwand auf einer "topLayer" befindet, die über eine eigene Kamera verfügt.

Die Schaltfläche Quadrat + in den OverlayCanvas befindet sich ebenfalls auf "topLayer". Aber ich möchte nur, dass die Schaltfläche und das rosa Quadrat (und was darin enthalten ist) anklickbar sind, da das Spiel auf Klicks auf das Hintergrundbild angewiesen ist.

Captain Carl
quelle

Antworten:

18

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 0000000000000101als (1 | 1<<2)oder 5dargestellt 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 GraphicRaycasterursprünglich über dieses System verwendet werden (genau wie der Physics Raycaster und sein 2D-Gegenstück, die sich alle von Physics.Raycastdenen 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 Triggerund verwenden Sie den Editor, um alle Ihre Verbindungen zu erstellen.
  • Wenn Sie den Editor vermeiden möchten, MonoBehaviourkönnen Sie abhängig vom Ereignis, das Sie erfassen möchten, eine bestimmte Schnittstelle implementieren. Dies sind die UnityEngine.EventSystems.I...HandlerSchnittstellen wie die IBeginDragHandlerSchnittstelle

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 GraphicRaycasters Raycast Funktion selbst statt der Schaffung Code als Reaktion auf ein Ereignis. Dazu benötigen wir den folgenden Codeausschnitt, in dem wir ein PointerEventDataObjekt erstellen , das an die RaycastFunktion 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);

resultsenthä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.

Coburn
quelle