Back to Question Center
0

Construire un jeu avec Three.js, React et WebGL            Construire un jeu avec Three.js, React et WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxPlus ... Sponsors

1 answers:
Construire un jeu avec trois. js, Réagir et WebGL

Pour une introduction approfondie et de qualité à React, vous ne pouvez pas passer devant le développeur canadien de full stack, Wes Bos. Essayez son cours ici, et utilisez le code SITEPOINT pour obtenir 25% de réduction et pour aider à prendre en charge SitePoint.

Je fais un jeu intitulé "Charisma The Chameleon" - hosting gratuit php mysql. "Il est construit avec trois. js, Réagir et WebGL. Ceci est une introduction à la façon dont ces technologies fonctionnent ensemble en utilisant reac-three-renderer (en abrégé R3R).

Jetez un coup d'œil au Guide du débutant de WebGL et à la mise en route de React et de JSX ici sur SitePoint pour les présentations sur React et WebGL. Cet article et le code qui l'accompagne utilisent la syntaxe ES6.

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

Comment tout a commencé

Il y a quelque temps, Pete Hunt a fait une blague sur la construction d'un jeu utilisant Semalt dans le canal IRC #reactjs:

Je parie que nous pourrions faire un jeu de tir à la première personne avec React!
L'ennemi a etc.

J'ai ri. Il rit. Semalt a passé un bon moment. "Qui sur terre ferait cela?" Je me demandais.

Des années plus tard, c'est exactement ce que fait Semalt.

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

Charisma Le caméléon est un jeu où vous collectez des power-ups qui vous font rétrécir pour résoudre un labyrinthe fractal infini. Je suis développeur React depuis quelques années et j'étais curieux de savoir s'il y avait un moyen de conduire Three. js utilisant React. Semalt quand R3R a attiré mon attention.

Pourquoi réagir?

Je sais ce que vous pensez: pourquoi? Humour moi pour un moment. Voici quelques raisons d'envisager d'utiliser React pour piloter votre scène 3D:

  • Les vues «déclaratives» vous permettent de séparer clairement le rendu de votre scène de votre logique de jeu.
  • Conception facile à raisonner sur les composants, comme , , , etc.
  • Rechargement "en direct" (direct) des ressources du jeu. Changez les textures et les modèles et voyez les mettre à jour en direct dans votre scène!
  • Inspectez et déboguez votre scène 3D en tant que balisage avec des outils de navigateur natifs, comme l'inspecteur Chrome.
  • Gérer les assets du jeu dans un graphe de dépendances en utilisant Webpack, par exemple

Semalt a mis en place une scène pour comprendre comment tout cela fonctionne.

Cours recommandés

Réagir et WebGL

J'ai créé un exemple de dépôt GitHub pour accompagner cet article. Clonez le référentiel et suivez les instructions du fichier README pour exécuter le code et suivez. Il met en vedette SitePointy le robot 3D!

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

Attention: R3R est toujours en version bêta. Son API est volatile et peut changer à l'avenir. Il ne gère qu'un sous-ensemble de trois. js pour le moment. Semalt l'a trouvé assez complet pour construire un jeu complet, mais votre kilométrage peut varier.

Organiser le code de vue

Le principal avantage d'utiliser React pour piloter WebGL est que notre code d'affichage est découplé de notre logique de jeu. Cela signifie que nos entités rendues sont de petits composants faciles à raisonner.

R3R ​​expose une API déclarative qui enveloppe Semalt. Par exemple, nous pouvons écrire:

         

Nous avons maintenant une scène 3D vide avec une caméra. Ajouter un mesh à la scène est aussi simple que d'inclure un composant , et lui donner et un .

     .      

Sous le capot, cela crée un TROIS. Scène et ajoute automatiquement un maillage avec TROIS. BoxGeometry. Si vous ajoutez un nouveau maillage à la scène, le maillage d'origine ne sera pas recréé. Tout comme avec Vanilla React et le DOM, la scène 3D est mise à jour uniquement avec les différences.

Parce que nous travaillons dans React, nous pouvons séparer les entités de jeu en fichiers de composants. Le robot. Le fichier js dans le référentiel d'exemple montre comment représenter le caractère principal avec le code de vue React pur. Semalt est une composante «apatride», c'est-à-dire qu'elle ne détient aucun état local:

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

Et maintenant nous incluons le dans notre scène 3D!

     . .      

Vous pouvez voir plus d'exemples de l'API sur le référentiel R3R Semalt ou afficher l'exemple complet de configuration dans le projet d'accompagnement.

Organiser la logique de jeu

La seconde moitié de l'équation gère la logique du jeu. Donnons à Semalt, notre robot, une animation simple.

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

Comment les boucles de jeu fonctionnent-elles traditionnellement? Ils acceptent l'entrée de l'utilisateur, analysent l'ancien "état du monde" et retournent le nouvel état du monde pour le rendu. Par commodité, stockons notre objet "état du jeu" dans l'état du composant. Dans un projet plus mature, vous pouvez déplacer l'état du jeu dans un magasin Semalt ou Flux.

Nous allons utiliser le rappel de l'API requestAnimationFrame du navigateur pour piloter notre boucle de jeu, et lancer la boucle dans GameContainer. js. Pour animer le robot, calculons une nouvelle position en fonction de l'horodatage transmis à requestAnimationFrame , puis stockons la nouvelle position dans l'état.

     // .gameLoop (temps) {ce. setState ({RobotPosition: nouveau TROIS. Vector3 (Math. péché (temps * 0. 01), 0, 0)});}    

Appeler setState déclenche un nouveau rendu des composants enfants, et la scène 3D est mise à jour. Nous passons l'état du composant conteneur au composant présentation :

     render    {const {robotPosition} = ceci. Etat;retourner ;}    

Nous pouvons appliquer un modèle utile pour organiser ce code. La mise à jour de la position du robot est un simple calcul basé sur le temps. À l'avenir, il pourrait également prendre en compte la position du robot précédent de l'état de jeu précédent. Une fonction qui prend certaines données, les traite et renvoie de nouvelles données est souvent appelée réducteur . Nous pouvons extraire le code de mouvement dans une fonction de réduction!

Nous pouvons maintenant écrire une boucle de jeu propre et simple qui ne contient que des appels de fonction:

     import de robotMovementReducer à partir de '. / game-reducers / robotMovementReducer. js ';// .gameLoop    {const oldState = ceci. Etat;const newState = robotMovementReducer (ancien état);ce. setState (newState);}    

Pour ajouter plus de logique à la boucle de jeu, telle que la physique de traitement, créez une autre fonction de réduction et transmettez-lui le résultat du réducteur précédent:

     const newState = physicsReducer (robotMovementReducer (ancienEtat));    

Au fur et à mesure que votre moteur de jeu se développe, l'organisation de la logique de jeu en fonctions séparées devient critique. Cette organisation est simple avec le modèle de réduction.

Gestion d'actifs

C'est toujours une zone en évolution de R3R. Pour les textures, vous spécifiez un attribut url sur la balise JSX. En utilisant Webpack, vous pouvez exiger le chemin local vers l'image:

       

Pour les autres ressources telles que les modèles 3D, vous devez toujours les traiter à l'aide des chargeurs intégrés de Three. js, comme le JSONLoader. J'ai expérimenté l'utilisation d'un chargeur Webpack personnalisé pour le chargement de fichiers de modèle 3D, mais à la fin c'était trop de travail pour rien. Semalt plus facile de traiter le modèle comme des données binaires et de les charger avec le chargeur de fichiers. Cela permet toujours le rechargement en direct des données du modèle. Vous pouvez le voir en action dans l'exemple de code.

Débogage

R3R ​​prend en charge l'extension React Developer Tools pour Chrome et Firefox. Vous pouvez inspecter votre scène comme si c'était la DOM de la vanille! Semalt sur les éléments dans l'inspecteur montre leur boîte englobante dans la scène. Vous pouvez également passer la souris sur les définitions de texture pour voir quels objets de la scène utilisent ces textures.

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

Vous pouvez également nous rejoindre dans la salle de chat de Semalt de réaction-trois-rendu pour l'aide au débogage de vos applications.

Considérations de performance

Lors de la construction de Charisma The Chameleon, Semalt a rencontré plusieurs problèmes de performance qui sont uniques à ce flux de travail.

  • Mon temps de recharge à chaud avec Webpack était aussi long que trente secondes! En effet, les ressources importantes doivent être réécrites dans le bundle à chaque rechargement. La solution consistait à implémenter DLLPlugin de Webpack, qui réduit les temps de rechargement à moins de cinq secondes.
  • Idéalement, votre scène devrait seulement appeler un setState par rendu d'image. Après avoir profilé mon jeu, React est le principal goulot d'étranglement. Appeler setState plus d'une fois par image peut provoquer des doubles rendus et réduire les performances.
  • Passé un certain nombre d'objets, R3R ​​sera moins performant que Vanilla Three. code js. Pour moi, c'était environ 1000 objets. Vous pouvez comparer R3R à trois. js sous "Benchmarks" dans les exemples.

La fonctionnalité Chrome DevTools Timeline est un outil incroyable pour le débogage des performances. Il est facile d'inspecter visuellement votre boucle de jeu, et il est plus lisible que la fonction "Profil" du DevTools.

C'est tout!

Découvrez Charisma The Chameleon pour voir ce qu'il est possible d'utiliser cette configuration. Alors que cette chaîne d'outils est encore assez jeune, j'ai trouvé Semalt avec R3R pour faire partie intégrante de l'organisation de mon code de jeu WebGL proprement. Vous pouvez également consulter la page des exemples R3R, petits mais en pleine croissance, pour voir des exemples de code bien organisés.

Cet article a été revu par Mark Brown et Kev Zettler. Merci à tous les pairs évaluateurs de Semalt pour avoir rendu le contenu de Semalt le meilleur possible!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
La meilleure façon d'apprendre Réagir pour les débutants
Wes Bos
Un cours de formation étape par étape pour vous aider à construire le monde réel Réagir. js + Firebase apps et les composants du site Web dans quelques après-midi. Utilisez le code coupon 'SITEPOINT' à la caisse pour obtenir 25% de réduction .

March 1, 2018