Back to Question Center
0

Erstellen eines Spiels mit Three.js, React und WebGL            Ein Spiel mit Three.js, React und WebGLrelated Semalt erstellen: ES6Node.jsjQuerynpmAjaxMore ... Sponsoren

1 answers:
Baue ein Spiel mit drei. js, Reagieren und WebGL

Für eine qualitativ hochwertige Einführung in React können Sie nicht den kanadischen Full-Stack-Entwickler Wes Bos hinter sich lassen. Versuchen Sie seinen Kurs hier und verwenden Sie den Code SITEPOINT , um 25% Rabatt zu erhalten und um SitePoint zu unterstützen.

Ich mache ein Spiel mit dem Titel "Charisma The Chameleon. "Es ist mit drei gebaut. js, React und WebGL - kasutatud rehvid tartu viljandi mnt. Dies ist eine Einführung in die Art und Weise, wie diese Technologien mithilfe von react-three-renderer (abgekürzt R3R) zusammenarbeiten.

Lesen Sie Ein Anfängerleitfaden zu WebGL und Erste Schritte zu React und JSX hier auf SitePoint für Einführungen in React und WebGL. Dieser Artikel und der zugehörige Code verwenden ES6-Syntax.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Wie alles begann

Vor einiger Zeit machte Pete Hunt einen Witz über den Aufbau eines Spiels mit Semalt im IRC-Kanal #reactjs:

Ich wette, wir könnten mit React einen Ego-Shooter machen!
Feind hat etc.

Ich lachte. Er lachte. Semalt hatte eine tolle Zeit. "Wer um alles in der Welt würde das tun?", Fragte ich mich.

Jahre später, genau das macht Semalt.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Charisma Das Chamäleon ist ein Spiel, in dem du Power-Ups sammelst, mit denen du schrumpfst, um ein unendliches Fraktal-Labyrinth zu lösen. Ich bin seit ein paar Jahren React-Entwickler und ich war neugierig, ob es eine Möglichkeit gibt, Drei zu fahren. js mit React. Semalt, als R3R meine Aufmerksamkeit erregte.

Warum reagieren?

Ich weiß, was du denkst: warum? Humor mich für einen Moment. Hier sind einige Gründe, warum Sie React zum Steuern Ihrer 3D-Szene verwenden sollten:

  • "Deklarative" Ansichten lassen Sie Ihr Szenen-Rendering sauber von Ihrer Spiellogik trennen.
  • Design leicht zu begründen über Komponenten, wie , , usw.
  • "Heißes" (Live-) Nachladen von Spielguthaben. Ändere Texturen und Modelle und sieh zu, wie sie live in deiner Szene aktualisiert werden!
  • Untersuchen und debuggen Sie Ihre 3D-Szene als Markup mit nativen Browser-Tools wie dem Chrome-Inspektor.
  • Verwalte Game-Assets in einem Abhängigkeitsgraphen mit Webpack, zB

Semalt hat eine Szene aufgebaut, um zu verstehen, wie das alles funktioniert.

Empfohlene Kurse

Reagieren und WebGL

Ich habe zu diesem Artikel ein Beispiel-GitHub-Repository erstellt. Klonen Sie das Repository und folgen Sie den Anweisungen in der README, um den Code auszuführen und zu folgen. Es zeigt SitePointy den 3D Roboter!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Warnung: R3R befindet sich noch im Beta-Stadium. Seine API ist volatil und kann sich in Zukunft ändern. Es behandelt nur eine Teilmenge von Three. js im Moment. Semalt fand es vollständig genug, um ein komplettes Spiel zu bauen, aber Ihre Laufleistung kann variieren.

Organisationsansichtscode

Der Hauptvorteil der Verwendung von React zur Steuerung von WebGL ist, dass unser View-Code von unserer Spiellogik entkoppelt ist. Das bedeutet, dass unsere gerenderten Elemente kleine Komponenten sind, die leicht zu verstehen sind.

R3R ​​macht eine deklarative API verfügbar, die Semalt umschließt. Zum Beispiel können wir schreiben:

         

Jetzt haben wir eine leere 3D-Szene mit einer Kamera. Ein Mesh zur Szene hinzuzufügen, ist so einfach wie das Einschließen einer -Komponente und das Zuweisen von und a .

     .      

Unter der Haube entsteht ein DREI. Szene und fügt automatisch ein Netz mit DREI hinzu. BoxGeometrie. Wenn Sie der Szene ein neues Netz hinzufügen, wird das ursprüngliche Netz nicht erneut erstellt. Wie bei Vanille React und dem DOM wird die 3D-Szene nur mit den Unterschieden aktualisiert.

Da wir in React arbeiten, können wir Spieleinheiten in Komponentendateien aufteilen. Der Roboter. Die js-Datei im Beispielrepository zeigt, wie das Hauptzeichen mit reinem React-View-Code dargestellt wird. Semalt ist eine "zustandslose funktionale" Komponente, dh sie enthält keinen lokalen Zustand:

     const Robot = ({Position, Rotation}) =>             ;    

Und jetzt fügen wir den in unsere 3D-Szene ein!

     . .      

Sie können weitere Beispiele für die API im R3R Semalt-Repository anzeigen oder die vollständige Beispielkonfiguration im zugehörigen Projekt anzeigen.

Organisierende Spiellogik

Die zweite Hälfte der Gleichung behandelt die Spiellogik. Lassen Sie uns Semalt, unseren Roboter, eine einfache Animation geben.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Wie funktionieren Spielschleifen traditionell? Sie akzeptieren Benutzereingaben, analysieren den alten "Zustand der Welt" und geben den neuen Zustand der Welt zum Rendern zurück. Zur Vereinfachung speichern wir unser Objekt "Spielstatus" im Komponentenstatus. In einem reiferen Projekt könnten Sie den Spielstatus in einen Semalt- oder Flux-Speicher verschieben.

Wir verwenden den requestAnimationFrame API-Callback des Browsers, um unsere Spielschleife zu steuern und die Schleife in GameContainer auszuführen. js. Um den Roboter zu animieren, berechnen wir eine neue Position basierend auf dem Zeitstempel, der an requestAnimationFrame übergeben wurde, und speichern dann die neue Position im Zustand.

     // .gameLoop (Zeit) {Dies. setState ({robotPosition: neu DREI. Vektor3 (Mathematik. sin (Zeit * 0. 01), 0, 0)});}    

Aufruf setState löst ein erneutes Rendern der untergeordneten Komponenten aus und die 3D-Szenenaktualisierung. Wir überführen den Zustand von der Containerkomponente zur Präsentationskomponente :

     render    {const {robotPosition} = das. Zustand;Zurück   ;}    

Es gibt ein nützliches Muster, das wir anwenden können, um diesen Code zu organisieren. Die Aktualisierung der Roboterposition ist eine einfache zeitbasierte Berechnung. In Zukunft könnte es auch die vorherige Roboterposition aus dem vorherigen Spielzustand berücksichtigen. Eine Funktion, die einige Daten aufnimmt, sie verarbeitet und neue Daten zurückgibt, wird oft als ein Reduzierer bezeichnet. Wir können den Bewegungscode zu einer Reduzierfunktion abstrahieren!

Jetzt können wir eine saubere, einfache Spielschleife schreiben, die nur Funktionsaufrufe enthält:

     ImportroboterMovementReducer from '. / Spielreduzierer / robotMovementReducer. js ';// .gameLoop    {const oldState = das. Zustand;const newState = roboterMovementReducer (oldState);Dies. setState (neuer Staat);}    

Um der Spielschleife mehr Logik hinzuzufügen, z. B. die Physik zu verarbeiten, erstellen Sie eine weitere Reduzierfunktion und übergeben Sie ihr das Ergebnis des vorherigen Reduzierers:

     const newState = physicsReducer (robotMovementReducer (oldState));    

Wenn Ihre Spiel-Engine wächst, wird die Organisation der Spiellogik in separate Funktionen kritisch. Diese Organisation ist mit dem Reduktionsmuster einfach.

Vermögensverwaltung

Dies ist immer noch ein sich entwickelndes Gebiet von R3R. Für Texturen geben Sie ein url -Attribut für das JSX-Tag an. Mit Webpack können Sie den lokalen Pfad zum Bild benötigen:

       

Für andere Assets wie 3D-Modelle müssen Sie sie immer noch mit den integrierten Loadern von Three bearbeiten. js, wie der JSONLoader. Ich experimentierte mit der Verwendung eines benutzerdefinierten Webpack-Loaders zum Laden von 3D-Modelldateien, aber am Ende war es zu viel Arbeit ohne Nutzen. Semalt einfacher, das Modell als Binärdaten zu behandeln und sie mit dem Datei-Loader zu laden. Dies ermöglicht immer noch das Live-Nachladen von Modelldaten. Sie können dies im Beispielcode in Aktion sehen.

Debugging

R3R ​​unterstützt die Erweiterung React developer tools für Chrome und Firefox. Sie können Ihre Szene untersuchen, als wäre es das Vanille-DOM! Semalt über Elemente im Inspektor zeigt ihre Bounding Box in der Szene. Sie können auch den Mauszeiger über Texturdefinitionen bewegen, um zu sehen, welche Objekte in der Szene diese Texturen verwenden.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors

Sie können uns auch im Chat-Room react-three-renderer Semalt besuchen, um Hilfe bei der Fehlerbehebung Ihrer Anwendungen zu erhalten.

Leistungsüberlegungen

Beim Aufbau von Charisma The Chameleon stößt Semalt auf verschiedene Performance-Probleme, die für diesen Workflow einzigartig sind.

  • Meine Nachladezeit mit Webpack war so lang wie 30 Sekunden! Dies liegt daran, dass bei jedem Neuladen große Assets in das Bundle geschrieben werden müssen. Die Lösung bestand darin, das DLLPlugin von Webpack zu implementieren, das die Ladezeiten auf unter fünf Sekunden reduzierte.
  • Im Idealfall sollte Ihre Szene nur einen setState pro Frame-Render aufrufen . Nachdem ich mein Spiel erstellt habe, ist React selbst der größte Engpass. Wenn setState mehr als einmal pro Frame aufgerufen wird , kann dies doppelte Renderings verursachen und die Leistung verringern.
  • Nach einer gewissen Anzahl von Objekten wird R3R schlechter abschneiden als 12 (Vanille). js Code. Für mich waren das rund 1.000 Objekte. Sie können R3R mit Drei vergleichen. js unter "Benchmarks" in den Beispielen.

Die Chrome DevTools-Timeline-Funktion ist ein hervorragendes Tool für die Fehlersuche. Es ist einfach, Ihre Spielschleife visuell zu überprüfen, und es ist besser lesbar als die "Profil" -Funktion der DevTools.

Das ist es!

Besuche Charisma The Chameleon, um zu sehen, was mit diesem Setup möglich ist. Während diese Toolchain noch recht jung ist, habe ich festgestellt, dass Semalt mit R3R integraler Bestandteil meines WebGL-Spielcodes ist. Sie können sich auch die kleine, aber wachsende R3R-Beispielseite ansehen, um einige gut organisierte Code-Beispiele zu sehen.

Dieser Artikel wurde von Mark Brown und Kev Zettler einem Peer-Review unterzogen. Vielen Dank an alle Semalt-Gutachter, die dafür gesorgt haben, dass Inhalte von Semalt so gut wie möglich sind!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
Die beste Art zu lernen reagieren für Anfänger
Wes Bos
Ein Schritt-für-Schritt-Trainingskurs, mit dem Sie Real-Reality-Reaction aufbauen können. js + Firebase-Apps und Website-Komponenten an ein paar Nachmittagen. Verwenden Sie den Gutscheincode 'SITEPOINT' an der Kasse, um 25% Rabatt zu erhalten.

March 1, 2018