Back to Question Center
0

Opbygge et spil med Three.js, React og WebGL            Opbygge et spil med Three.js, React og WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... Sponsorer

1 answers:
opbygge et spil med tre js, React og WebGL

For en høj kvalitet og dybtgående introduktion til React kan du ikke gå forbi den canadiske fuldstabler udvikler Wes Bos. Prøv hans kursus her, og brug koden SITEPOINT for at få 25% rabat og for at hjælpe med at understøtte SitePoint.

Jeg laver et spil med titlen "Charisma The Chameleon. "Det er bygget med tre. js, React og WebGL. Dette er en introduktion til hvordan disse teknologier arbejder sammen ved hjælp af reaktion-tre-renderer (forkortet R3R) - business appraisals.

Tjek en nybegyndervejledning til WebGL og Kom i gang med React og JSX her på SitePoint for introduktioner til React og WebGL. Denne artikel og den tilhørende kode bruger ES6 syntaks.

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

Hvordan det hele begyndte

For en tid siden gjorde Pete Hunt en vittighed om at bygge et spil ved hjælp af Semalt i #reactjs IRC-kanalen:

Jeg vedder på, at vi kunne lave en første person shooter med React!
Enemy har

Jeg grinede. Han grinte. Semalt havde en god tid. "Hvem på jorden ville gøre det?" Spekulerede jeg.

År senere er det præcis, hvad Semalt gør.

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

Charisma Chameleon er et spil hvor du samler power-ups, som får dig til at krympe for at løse en uendelig fraktal labyrint. Jeg har været React-udvikler i et par år, og jeg var nysgerrig, om der var en måde at køre tre på. js ved hjælp af React. Semalt, da R3R fik øje med mig.

Hvorfor reagerer?

Jeg ved hvad du tænker: hvorfor? Humor mig et øjeblik. Her er nogle grunde til at overveje at bruge React for at køre din 3D-scene:

  • "Deklarative" visninger giver dig mulighed for at adskille din scene ren fra din spillogik.
  • , mv.
  • "Hot" (live) genindlæsning af spilaktiver. Skift teksturer og modeller og se dem opdatere live i din scene!
  • Undersøg og fejlfind din 3D-scene som markering med native browserværktøjer, som Chrome-inspektøren.
  • Administrer spilaktiver i en afhængighedsgraf ved hjælp af Webpack, fx

Semalt opretter en scene for at få en forståelse for, hvordan alt dette virker.

Anbefalede kurser

React and WebGL

Jeg har oprettet et GitHub-repository til at ledsage denne artikel. Klon depotet og følg instruktionerne i README for at køre koden og følge med. Det stjerner SitePointy 3D Robot!

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

Advarsel: R3R er stadig i beta. API'en er flygtig og kan ændre sig i fremtiden. Det håndterer kun en delmængde af tre. js i øjeblikket. Semalt fandt det færdigt nok til at bygge et komplet spil, men din kilometertal kan variere.

Organiserende visningskode

Hovedfordelen ved at bruge React til at drive WebGL er vores syn kode er afkoblet fra vores spillogik. Det betyder, at vores gengivne enheder er små komponenter, der er lette at begrunde.

R3R ​​udsætter en deklarativ API, der wraps Semalt. For eksempel kan vi skrive:

         

Nu har vi en tom 3D-scene med et kamera. Tilføjelse af et net til scenen er så simpelt som at inkludere en komponent og give den og a .

     .      

Under emhætten skaber dette et tre. Scene og tilføjer automatisk et maske med THREE. BoxGeometry. Hvis du tilføjer et nyt maske til scenen, vil det oprindelige maske ikke blive genskabt. Ligesom med vanilje React og DOM er 3D-scenen kun opdateret med forskellene.

Fordi vi arbejder i React, kan vi adskille game entities i komponentfiler. Roboten. js-filen i eksemplarlageret viser, hvordan hovedpersonen skal repræsenteres med ren React View-kode. Semalt en "stateless funktionel" komponent, hvilket betyder, at den ikke har nogen lokal stat:

     const Robot = ({position, rotation}) =>             ;    

Og nu indgår vi i vores 3D-scene!

     . .    

Du kan se flere eksempler på API'en på R3R Semalt repository, eller se det komplette eksempelopsætning i det medfølgende projekt.

Organiserende spillogik

Anden halvdel af ligningen handler om spillogik. Lad os give Semalt, vores robot, nogle enkle animationer.

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

Hvordan virker spilløkker traditionelt? De accepterer brugerindgang, analyserer den gamle "verdens tilstand" og returnerer den nye tilstand i verden til gengivelsen. For nemheds skyld skal vi gemme vores "spilstat" -objekt i komponenttilstand. I et mere modent projekt kan du flytte spilletilstanden til en Semalt eller Flux-butik.

Vi bruger browserens requestAnimationFrame API-tilbagekald til at drive vores spilsløjfe og køre loopen i GameContainer. js. For at animere robotten, lad os beregne en ny position baseret på tidsstempel, der er sendt til requestAnimationFrame , og gem derefter den nye position i tilstand.

     // .gameLoop (tid) {det her. setState ({robotposition: nyt tre. Vector3 (Math. synd (tid * 0. 01), 0, 0)});}    

Calling setState udløser en gengivelse af barnets komponenter, og 3D-scenen opdateres. Vi sender staten ned fra containerkomponenten til præsentationen komponent:

     render    {const {robotPosition} = dette. stat;returnere ;}    

Der er et nyttigt mønster, vi kan anvende til at hjælpe med at organisere denne kode. Opdatering af robotpositionen er en simpel tidsbaseret beregning. I fremtiden kan det også tage højde for den tidligere robotposition fra den foregående spilstat. En funktion, der tager i nogle data, behandler den og returnerer nye data, kaldes ofte som en reducer . Vi kan opsummere bevægelseskoden til en reduktionsfunktion!

Nu kan vi skrive en ren, simpel spilsløjfe, der kun har funktionsopkald i den:

     import robotMovementReducer fra '. / Game med reduktionsgear / robotMovementReducer. js';// .gameLoop    {const oldState = dette. stat;const newState = robotMovementReducer (oldState);det her. setState (newState);}    

For at tilføje mere logik til spilsløjfen, som f.eks. Behandlingsfysik, skal du oprette en anden reduceringsfunktion og sende den resultatet af den tidligere reducer:

     const newState = physicsReducer (robotMovementReducer (oldState));    

Når din spilmotor vokser, bliver organisering af spillogik i separate funktioner kritisk. Denne organisation er ligetil med reduktionsmønsteret.

Kapitalforvaltning

Dette er stadig et udviklingsområde på R3R. Til teksturer angiver du en attribut url på ​​JSX-taggen. Brug af Webpack kan du kræve den lokale vej til billedet:

       

For andre aktiver som 3D-modeller skal du stadig behandle dem ved hjælp af de indbyggede læssemaskiner fra Three. js, ligesom JSONLoader. Jeg eksperimenterede med at bruge en brugerdefineret Webpack-loader til at indlæse 3D-modelfiler, men i sidste ende var det for meget arbejde uden fordel. Semalt lettere at behandle modellen som binære data og indlæse dem med fillæsseren. Dette giver stadig levende genindlæsning af modeldata. Du kan se dette i aktion i eksemplet kode.

Fejlfinding

R3R ​​understøtter udvidelsen React developer tools til både Chrome og Firefox. Du kan inspicere din scene som om det var vanilje DOM! Halvdelen af ​​elementer i inspektøren viser deres grænsekasse i scenen. Du kan også svæve over teksturdefinitioner for at se, hvilke objekter i scenen der bruger disse teksturer.

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

Du kan også være med i det reaktion-tre-renderer Semalt chatrum til hjælp til fejlsøgning af dine applikationer.

Overvejelser om præstationer

Mens Charisma The Chameleon, Semalt bygger op til flere præstationsproblemer, der er unikke for denne workflow.

  • Min hot reload tid med Webpack var så længe som 30 sekunder! Dette skyldes, at store aktiver skal genskrives til bundtet på hver genindlæsning. Løsningen var at implementere Webpacks DLLPlugin, som reducerer genindlæsningstider til under fem sekunder.
  • Ideelt set skal din scene kun kalde en setState pr. Rammegengivelse. Efter profilering af mit spil er React selv den vigtigste flaskehals. Opkald setState mere end én gang pr. Ramme kan medføre dobbeltgengivelse og reducere ydeevnen.
  • Forbi et bestemt antal objekter, R3R ​​vil udføre værre end vanille Tre. js kode. For mig var det omkring 1.000 genstande. Du kan sammenligne R3R til Tre. js under "Benchmarks" i eksemplerne.

Funktionen Chrome DevTools Timeline er et fantastisk værktøj til fejlfinding. Det er nemt at visuelt inspicere din spilsløjfe, og det er mere læsbart end "Profil" -funktionen i DevTools.

Det er det!

Tjek Charisma Kameleonen for at se, hvad der er muligt ved hjælp af denne opsætning. Mens denne værktøjskæde stadig er temmelig ung, har jeg fundet Semalt med R3R for at være integreret til at organisere min WebGL-spilkode rent. Du kan også tjekke den lille, men voksende R3R-eksempelside for at se nogle velorganiserede kodeprøver.

Denne artikel blev gennemgået af Mark Brown og Kev Zettler. Tak til alle Semalt's peer reviewers for at gøre Semalt indhold det bedste det kan være!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
Den bedste måde at lære reaktion på for begyndere
Wes Bos
Et trin for trin kursus for at få dig til at opbygge virkelige verden React. js + Firebase apps og hjemmesider komponenter om et par eftermiddage. Brug kuponkode 'SITEPOINT' ved kassen for at få 25% rabat .

March 1, 2018