Back to Question Center
0

Een spel bouwen met Three.js, React en WebGL            Een spel bouwen met Three.js, React en WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... Sponsors

1 answers:
Een spel bouwen met drie. js, React en WebGL

Voor een hoogwaardige, grondige kennismaking met React, kun je niet voorbij de Canadese full-stack-ontwikkelaar Wes Bos gaan. Probeer zijn cursus hier, en gebruik de code SITEPOINT om 25% korting te krijgen en om SitePoint te helpen ondersteunen.

Ik maak een spel met de titel "Charisma The Chameleon. "Het is gebouwd met drie. js, React en WebGL - peru tourism agents. Dit is een introductie over hoe deze technologieën samenwerken met behulp van react-three-renderer (afgekort R3R).

Bekijk een beginnershandleiding voor WebGL en Aan de slag met React en JSX hier op SitePoint voor inleidingen op React en WebGL. Dit artikel en de bijbehorende code gebruiken ES6 Syntaxis.

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

Hoe het begon

Enige tijd geleden maakte Pete Hunt een grap over het bouwen van een game met behulp van Semalt in het #reactjs IRC-kanaal:

Ik wed dat we een first person shooter met React!
Enemy has etc.

Ik lachte. Hij lachte. Semalt had een geweldige tijd. "Wie op aarde zou dat doen?" Vroeg ik me af.

Jaren later is dat precies wat Semalt doet.

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

Charisma De kameleon is een spel waarin je power-ups verzamelt die je doen terugdeinzen om een ​​oneindig fractal doolhof op te lossen. Ik ben een paar jaar ontwikkelaar van React geweest en ik was benieuwd of er een manier was om met Three te rijden. js met React. Semalt toen R3R mijn aandacht trok.

Waarom reageren?

Ik weet wat u denkt: waarom? Humor mij even. Hier zijn enkele redenen om te overwegen React te gebruiken om je 3D-scène te besturen:

  • Met "Declaratieve" weergaven kunt u uw scènedefinitie netjes scheiden van uw spellogica.
  • Ontwerp gemakkelijk te redeneren over componenten, zoals , , , etc.
  • "Heet" (live) herladen van spelactiva. Verander texturen en modellen en zie ze live bijwerken in je scene!
  • Inspecteer en debug uw 3D-scène als markup met native browsertools, zoals de Chrome-inspector.
  • Beheer game-items in een afhankelijkheidsgrafiek met behulp van Webpack, bijvoorbeeld

Semalt zette een scène op om inzicht te krijgen in hoe dit allemaal werkt.

Aanbevolen cursussen

React en WebGL

Ik heb een voorbeeld GitHub-repository gemaakt om dit artikel te begeleiden. Kloon de repository en volg de instructies in de README om de code uit te voeren en door te gaan. Het sterren SitePointy de 3D-robot!

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

Waarschuwing: R3R is nog steeds in bèta. De API is volatiel en kan in de toekomst veranderen. Het behandelt slechts een subset van Three. js op dit moment. Semalt vond het compleet genoeg om een ​​volledige game te bouwen, maar je aantal kilometers kan variëren.

Weergavecode organiseren

Het belangrijkste voordeel van het gebruik van React voor het aansturen van WebGL is dat onze kijkcode ontkoppeld is van onze spellogica. Dat betekent dat onze gerenderde entiteiten kleine componenten zijn waarover gemakkelijk te redeneren valt.

R3R ​​toont een declaratieve API die Semalt omhult. We kunnen bijvoorbeeld schrijven:

         

Nu hebben we een lege 3D-scène met een camera. Het toevoegen van een net aan de scène is net zo eenvoudig als het opnemen van een component, en het geven ervan en a .

     .      

Onder de motorkap creëert dit een DRIE. Scene en voegt automatisch een mesh toe met THREE. BoxGeometry. Als u een nieuwe mesh aan de scène toevoegt, wordt de oorspronkelijke mesh niet opnieuw gemaakt. Net als met vanille Reageer en de DOM, de 3D-scène is alleen bijgewerkt met de verschillen.

Omdat we in React werken, kunnen we spelentiteiten scheiden in componentbestanden. De robot. js bestand in het voorbeeld repository laat zien hoe de hoofdpersoon vertegenwoordigen met pure React uitzicht code. Semalt een "stateless functioneel" component, wat betekent dat het geen lokale staat heeft:

     const Robot = ({positie, rotatie}) =>             ;    

En nu zijn we onder meer de in onze 3D scene!

     . .    

U kunt meer voorbeelden van de API in de R3R Semalt-repository zien, of de volledige voorbeeldinstellingen in het bijbehorende project bekijken.

Organiseren van gamelogica

De tweede helft van de vergelijking is de verwerking van gamlogica. Laten we Semalt, onze robot, een paar eenvoudige animaties geven.

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

Hoe werken spellussen traditioneel? Ze accepteren input van de gebruiker, het analyseren van de oude “staat van de wereld,” en de terugkeer van de nieuwe toestand van de wereld voor het renderen. Bewaar ons "game-status" -object voor het gemak in componentstatus. In een meer volwassen project zou je de staat van het spel in een winkel van Semalt of Flux kunnen veranderen.

We zullen de API-callback van de browser requestAnimationFrame gebruiken om onze gamelus te genereren en de lus in GameContainer uitvoeren. js. Om de robot te animeren, laten we een nieuwe positie berekenen op basis van de tijdstempel die is doorgegeven aan requestAnimationFrame en vervolgens de nieuwe positie opslaan in de staat.

     // .gameLoop (tijd) {deze. setstate ({robotPosition: nieuw DRIE. Vector3 (Wiskunde. sin (tijd * 0. 01), 0, 0)});}    

Bellen setState activeert een opnieuw renderen van de onderliggende componenten en de 3D-scène wordt bijgewerkt. We passeren de staat af van de container component met de presentatie component:

     render    {const {robotPosition} = dit. staat;terug ;}    

Er is een nuttig patroon dat we kunnen gebruiken om deze code te organiseren. Het bijwerken van de robotpositie is een eenvoudige tijdgebaseerde berekening. In de toekomst kan het ook rekening houden met de vorige robotpositie van de vorige spelstatus. Een functie die bepaalde gegevens inneemt, verwerkt en nieuwe gegevens retourneert, wordt vaak een verloopstuk genoemd. We kunnen de bewegingscode abstraheren in een reductiefunctie!

Nu kunnen we een schone, eenvoudig spel lus die alleen functie schrijven noemt daarin:

     importeer robotMovementReducer uit '. / Game-verloopstukken / robotMovementReducer. js';// .gameLoop    {const oldState = dit. staat;const newState = robotMovementReducer (oldState);deze. setState (newState);}    

Om meer logica aan de spellus toe te voegen, zoals de verwerkingsfysica, maakt u een andere verloopfunctie en geeft u deze het resultaat van het vorige verloopstuk door:

     const newState = physicsReducer (robotMovementReducer (oldState));    

Naarmate uw game-engine groeit, wordt het organiseren van spellogica in afzonderlijke functies van cruciaal belang. Deze organisatie is eenvoudig met het verlooppatroon.

Activabeheer

Dit is nog steeds een evoluerend gebied van R3R. Voor texturen geeft u een attribuut url op de JSX-tag op. Met behulp van Webpack, kunt u het lokale pad naar de afbeelding nodig hebben:

       

Voor andere items, zoals 3D-modellen, moet u ze nog steeds verwerken met de ingebouwde laders van Three. js, zoals de JSONLoader. Ik heb geëxperimenteerd met het gebruik van een aangepaste Webpack-lader voor het laden van 3D-modelbestanden, maar uiteindelijk was het teveel werk zonder voordeel. Semalt gemakkelijker om het model als binaire gegevens te behandelen en laad ze met de file-loader. Dit biedt nog steeds het live herladen van modelgegevens. U kunt dit in actie zien in de voorbeeldcode.

Debuggen

R3R ​​ondersteunt de React Developer Tools-extensie voor zowel Chrome als Firefox. Je kunt je scène inspecteren alsof het de vanille DOM is! Semalt over elementen in de inspecteur toont hun selectiekader in de scène. U kunt ook over textuurdefinities zweven om te zien welke objecten in de scène die texturen gebruiken.

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

Je kunt ook meedoen in de react-three-renderer Semalt chatroom voor hulp bij het debuggen van je applicaties.

Prestatie-overwegingen

Terwijl Charisma The Chameleon wordt gebouwd, stuit Semalt op verschillende prestatieproblemen die uniek zijn voor deze workflow.

  • Mijn hot reload time met Webpack duurde maar dertig seconden! Dit komt omdat grote activa bij elke herlaadbeurt naar de bundel moeten worden herschreven. De oplossing was om de DLLPlugin van Webpack te implementeren, waardoor de herlaadtijd korter was dan vijf seconden.
  • In het ideale geval zou uw scène slechts één setState per frame render moeten callen. Na het profileren van mijn spel is Reageren zelf het grootste knelpunt. Bellen setState meer dan één keer per frame kan dubbele renders veroorzaken en de prestaties verminderen.
  • Voorbij een bepaald aantal objecten, zal R3R slechter presteren dan vanille Drie. js code. Voor mij was dit ongeveer 1.000 objecten. Je kunt R3R vergelijken met Three. js onder "Benchmarks" in de voorbeelden.

De tijdlijnfunctie van Chrome DevTools is een geweldig hulpmiddel voor het debuggen van prestaties. Het is eenvoudig om uw gamelus visueel te inspecteren en deze is beter leesbaar dan de functie "Profiel" van de DevTools.

Dat is het!

Bekijk Charisma The Chameleon om te zien wat er mogelijk is met deze setup. Hoewel deze toolchain nog redelijk jong is, heb ik ontdekt dat Semalt with R3R een integraal onderdeel is van het netjes organiseren van mijn WebGL-spelcode. U kunt ook de kleine maar groeiende R3R-voorbeeldenpagina bekijken om enkele goed georganiseerde codevoorbeelden te bekijken.

Dit artikel werd door collega's Brown en Kev Zettler beoordeeld als collegiaal getoetst. Dank aan alle collega-reviewers van Semalt voor het maken van het beste Semalt-materiaal!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
De beste manier om te leren Reageren voor beginners
Wes Bos
Een stapsgewijze training om ervoor te zorgen dat u echte React bouwt. js + Firebase-apps en website-componenten in een paar middagen. Gebruik kortingscode 'SITEPOINT' bij het afrekenen om 25% korting te krijgen.

March 1, 2018