Raycasting wird häufig in der Entwicklung von Videospielen verwendet, z.B. um die Sichtlinie des Spielers oder der KI zu bestimmen, wohin ein Projektil geht, Laser zu erzeugen und vieles mehr. Ein Raycast ist im Wesentlichen ein Strahl, der von einer Position im 3D- oder 2D-Raum ausgesendet wird und sich in eine bestimmte Richtung bewegt. Unity 3D verfügt über integrierte Funktionen, mit denen Sie einen Raycast in ihrem Spiel implementieren können.
Raycast im Unity-Tutorial.
In diesem Beitrag werden wir ihnen Beispiele zeigen, wie man einen Raycast in Unity 3D implementiert und wie man die Raycast-Informationen verwendet, um festzustellen, ob sich ein Objekt in Sichtlinie des Benutzers befindet und ob wir mit diesem Objekt interagieren können.
Schritt 1:
Zuerst einmal gehen wir davon aus, dass Sie bereits ein Szenen-Setup mit einem Charakter-Controller der Art haben, den Sie verwenden können. Wenn nicht, dann sollten Sie eine neue Szene z.B. mit einem Flugzeug, auf dem Sie herumlaufen können, erstellen und zudem den Charakter-Controller in die Szene setzen. Wenn Sie keinen Controller haben, importieren Sie das Standard-Asset/Charaktere und ziehen Sie einen der vorgefertigten Controller per Drag & Drop in ihre Szene.
Schritt 2:
Sobald Sie ein grundlegendes Szenen-Setup haben, werden wir einen Würfel erstellen, indem wir zu GameObject > 3D-Object > Cube gehen.
Verschieben Sie den Cube in die Nähe ihres Controllers, damit wir jede Funktionalität, an der wir arbeiten, schnell und einfach testen können. Sobald der Cube an seinem Platz ist, werden wir ein benutzerdefiniertes Tag dafür erstellen wollen. Wir werden das Tag verwenden, um festzustellen, welches Objekt wir suchen, wenn unser Raycast darauf trifft. Beachten Sie, dass Sie dies mit einem Objektnamen oder beliebigen Anzahl von verschiedenen Variablen tun können.
Schritt 3:
Der Einfachheit halber werden wir ein Tag verwenden, um festzustellen, was wir uns ansehen. Um ein benutzerdefiniertes Tag zu erstellen, wählen Sie den Würfel in ihrer Szene aus und klicken Sie im Inspektor auf das Dropdown-Menü Tag und wählen Sie „Tag hinzufügen….“.
Klicken Sie im Tag-Manager auf das Symbol +, um ein neues Tag zu erstellen. Nennen wir diesen Tag „Interactive“.
Schritt 4:
Sobald das Tag erstellt ist, klicken Sie erneut auf den Cube und wählen Sie das neue Interactive Tag aus dem Tag-Dropdown-Menü.
Schritt 5:
Klicken Sie anschließend auf den Würfel und fügen Sie eine Starrkörperkomponente im Fenster „Komponente hinzufügen“ hinzu.
Schritt 6:
Nun, da wir das getan haben, lassen Sie uns fortfahren und den Raycast implementieren. Wählen Sie ihre Hauptkamera in ihrer Szene und fügen Sie ihr eine neue C#-Skript-Komponente mit der Bezeichnung LineOfSight hinzu.
Der Code:
Öffnen Sie LineOfSight in ihrem Skript-Editor. Anbei ein Screenshot des Codes:
Variablen in Skripten deklarieren:
Das erste, was unser Skript macht, ist die Deklarierung von vier Variablen: RaycastHit, float, bool, rigidbody. Wir werden all dies nutzen, um unsere Logik zu bestimmen. In der Startfunktion weisen wir unserer booleschen und unsere Float-Werte ihren Standardwerten zu. Dies geschieht zu Beginn des Spiels.
Dies ist die erste Zeile in unserer Update-Funktion.
Alles, was wir tun müssen, ist, eine rote Linie in unserer Szenenansicht zu zeichnen, und zwar jeden Frame, der auf unserem Spiel läuft. Der erste Parameter gibt die Position an, an der er beginnt, der zweite Parameter ist die Richtung, in die er sich bewegt, der dritte Parameter bestimmt die Strahlenfarbe und der vierte Parameter bestimmt die Dauer, in der die Linie auf dem Bildschirm gezeichnet wird. Wir tun dies in erster Linie zu Debuggingzwecken. Es erlaubt uns, unseren Raycast tatsächlich un unserer Szenenansicht zu sehen. Wir können es in der Game View sehen, indem wir auf die Option „Gizmo“ im Game View Fenster klicken.
Als nächstes scheuen wir uns an, was tatsächlich dazu führt, dass der RayCast ausgeführt wird:
Diese if-Anweisung wird im Wesentlichen ausgeführt, wenn ein RayCast auf etwas trifft. Die Bedingung für die if-Anweisung besteht aus einem Physics.Raycast Konstruktor, der in diesem Beispiel vier Parameter benötigt. Der erste Parameter ist die Position, an der der Raycast beginnt, die wir als Kameraposition angeben. Der zweite Parameter ist die Richtung, in die der Raycast geht, die wir als Vorwärtsrichtung unserer Kamera angeben. Dadurch wird sichergestellt, dass, wohin wir auch schauen, auch der Raycast ansprechend aussieht. Der dritte Parameter ist der Hit-Info-Parameter. Es wird weitere Informationen über die Raycast Kollision mit der von uns spezifizierten Variable liefern. In diesem Beispiel geben wir unsere RaycastHit-Variable mit der Bezeichnung vision als Argument für die Trefferinformation an. Das bedeutet, dass unsere Visionsvariable Kollisionsinformationen über das Objekt enthält, auf das unser Raycast trifft. Schließlich ist der vierte Parameter die Länge des Raycast, den wir als RayLenght angeben. Wir haben rayLenght in die Startfunktion zugewiesen. Es ist eine öffentliche Variable, so dass wir sie im Inspektor ändern können, wenn wir verschiedene Strahlenlängen testen wollen.
Innerhalb unserer raycast-Anweisung haben wir eine verschachtelte if-Anweisung, die das Tag des Objekts bestimmt, das unser raycast trifft:
Wenn das Objekt als „interaktiv“ markiert ist, was wir früher eingerichtet haben, dann werden wir etwas ausführen.
Diese Zeile gibt einfach den Names des Objekts, das wir gerade betrachten, an unsere Unity-Konsole aus. Wenn wir eine Art UI-Textanzeige hätten, könnten wir den Namen des Objekts einfach auf unserem UI-Display ausdrucken. Sie werden feststellen, wenn Sie nah genug dran sind und sich den Würfel in ihrer Szene ansehen, dass der Name des Würfels so auf der Konsole ausgegeben wird.
Als nächstes haben wir noch eine weitere verschachtelte if-Anweisung, die nur ausgeführt wird, wenn wir uns ein interaktives Objekt ansehen:
Wenn unser Spieler ein interaktives Objekt betrachtet, erlaubt diese Anweisung dem Spieler, E auf der Tastatur zu drücken und etwas auszuführen, aber nur, wenn wir nicht bereits etwas greifen. Sobald unser Spieler also E drückt und ein Objekt aufnehmen darf, führen wir diesen Code aus:
Wir haben grabbedObjekt dem Starrkörper des Objekts zugeordnet, das unser Raycast trifft. Denken Sie daran, dass dies nur passiert, wenn wir uns etwas ansehen, das als interaktiv markiert ist. Denken Sie daran, dass die Vision unsere RaycastHit-Variable ist, die Kollisionsinformationen darüber enthält, was unser Raycast trifft. Als nächstes setzen wir das grabbedObject auf kinematisch, was die physikalischen Interaktionen auf dem Objekt deaktiviert. Dies ermöglicht es unserem Spieler, das Objekt aufzunehmen und zu bewegen, ohne dass es durch Drehungen, Schwerkraft usw. beeinträchtigt wird. Danach setzen wir das übergeordnete Objekt unseres GrabbedObjects auf unsere Hauptkamera. Dadurch kann sich das aufgenommene Objekt relativ zu unserer Hauptkamera bewegen. Schließlich setzen wir isGrabbed auf true, damit unser Spiel weiß, dass wir im Besitz eines Objekts sind.
Danach haben wir eine if-Anweisung, eine else if-Anweisung:
Diese Anweisung sieht nach, ob der Spieler ein Objekt hält und ob er die Taste E drückt. Wenn beide wahr sind, dann lassen wir das Objekt fallen, indem wir den folgenden Code innerhalb der if-Anweisung ausführen:
Zuerst setzen wir den Elternteil des grabbedObjects auf nichts zurück, so dass er nicht mehr ein Child unserer Kamera ist. Dann stellen wir es auf nicht-kinematisch, so dass es wieder mit der Physik interagiert. Schließlich setzen wir isGrabbed auf false, damit wir ein anderes Objekt aufnehmen können, wenn wir wollen:
Letzter Schritt:
Das reicht für den Code. An dieser Stelle sollten Sie in der Lage sein, das Spiel auszuführen und zu ihrem Würfel zu gehen und sich diesen anzusehen. Sie sollten seinen Namen auf ihrer Konsole sehen können, und Sie sollten in der Lage sein, E zu drücken, um ihn aufzunehmen und sich mit ihm zu bewegen. Sie sollten anschließend in der Lage sein, erneut E zu drücken, um das Objekt fallen zu lassen,
Schlußfolgerungen:
Und damit ist diese einfache Einführung in Raycasts in Unity 3D abgeschlossen. Hoffentlich haben Sie es informativ gefunden. Falls Sie noch Fragen haben sollten, hinterlassen Sie uns unten einen Kommentar.
Vielen Dank für ihren Besuch.