Back to Question Center
0

Изграждане на игра с Three.js, React и WebGL            Изграждане на игра с Three.js, React и WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... Спонсори

1 answers:
Изграждане на игра с три. js, React и WebGL

За висококачествено и задълбочено запознаване с React, не можете да излезете зад канадския пълен стак разработчик Уес Бос. Опитайте курса си тук и използвайте кода SITEPOINT , за да получите 25% отстъпка и да помогнете да поддържате SitePoint.

Направих игра, озаглавена "Charisma The Chameleon. - Изградена е с Трима. js, React и WebGL - jupiter squared marron. Това е въведение към начина, по който тези технологии работят заедно, като използват реакция-триизмервачи (съкратено R3R).

Вижте Ръководство за начинаещи за WebGL и Първи стъпки с React и JSX тук в SitePoint за представяне на React и WebGL. Тази статия и придружаващият код използват ES6 Syntax.

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

Как започна всичко

Преди време Пийт Хънт направи шега за изграждането на игра, използвайки Semalt в IRC канала #rectjs:

Обзалагам се, че можем да направим стрелец на първо лице с Реакт!
Врагът има <глава /> <тяло> <крака>

Смях се. Той се засмя. Семал се забавляваше много. - Кой на земята ще направи това? - чудех се аз.

Години по-късно това е точно това, което Семалт прави.

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

Charisma Хамелеон е игра, в която събирате електрически прозорци, които ви карат да се свивате, за да решите безкраен фрактален лабиринт. Бях разработчик на Реакт за няколко години и бях любопитен, ако имаше начин да карам Трима. js чрез React. Селат, когато R3R хвана окото ми.

Защо реагираме?

Знам какво мислите: защо? Хуморете ме за миг. Ето някои причини да обмислите използването на React за шофиране на вашата 3D сцена:

  • "Деклариращи" изгледи ви позволяват да разделите ясно сценичното ви представяне от логиката на играта.
  • , <Стенен /> , <Ниво /> и т.н.
  • "Горещо" (на живо) презареждане на активите на дивеча. Променете текстурите и моделите и ги прегледайте на живо в сцената!
  • Проверявайте и отстранявайте грешките си от 3D сцена като маркиране с инструменти на браузъра, като инспектора на Chrome.

Семал създаде сцена, за да разбере как всичко това работи.

Препоръчани курсове

React и WebGL

Създадох примерно хранилище GitHub, което да придружава тази статия. Клонирайте хранилището и следвайте инструкциите в README, за да стартирате кода и да го следвате. Той звезди SitePointy на 3D робота!

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

Предупреждение: R3R все още е в бета версия. Неговият API е нестабилен и може да се промени в бъдеще. Той обработва само подмножество от три. js в момента. Семал го е намерил достатъчно завършен, за да изгради пълна игра, но разстоянието ви може да варира.

Организиране на изглед

Основната полза от използването на React за управление на WebGL е, че нашият код за изглед е отделен от нашата логика на играта. Това означава, че извършените от нас обекти са малки компоненти, за които лесно се разсъждаваме.

R3R ​​излага декларативен API, който обвива Semalt. Например, можем да напишем:

     <сцена>    

Сега имаме празна 3D сцена с камера. Добавянето на мрежа към сцената е толкова просто, колкото и включването на компонент, като се дава и .

     <сцена>.<Окото>      

Под капака, това създава ТРИ. Сцена и автоматично добавя мрежа с три. BoxGeometry. Ако добавите нова мрежа към сцената, оригиналната мрежа няма да бъде пресъздадена. Точно както при реакцията с ванилия и DOM, 3D сцената е актуализирана само с разликите.

Тъй като работим в React, можем да отделим игралните единици в компонентни файлове. Роботът. js файла в хранилището на примерите показва как да се представя основният знак с чист кода за реакция за реакция. Смисълът на компонента "без гражданство" означава, че той не притежава никаква местна държава:

     const Робот = ({позиция, ротация}) =>  <групапозиция = {позиция}ротация = {ротация}>  <ротация на окото = {localRotation}>         ;    

Сега вече включваме в нашата 3D сцена!

     <сцена>.<Меша> .    

Можете да видите повече примери за приложния програмен интерфейс (API) в хранилището R3R Semalt или да видите пълния пример за настройка в придружаващия го проект.

Организиране на игрова игра

Втората половина на уравнението обработва логиката на играта. Да дадем на Семалт, нашия робот, някаква проста анимация.

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

Как традиционно работят игрите? Те приемат входа на потребителите, анализират старото "състояние на света" и връщат новото състояние на света за рендиране. За удобство, нека да съхраним нашия обект "състояние на играта" в състояние на компонент. В един по-зрял проект можете да преместите състоянието на играта в магазин Semalt или Flux.

Ще използваме обратното обаждане API на requestAnimationFrame на браузъра, за да задвижим нашата игра и ще пуснем цикъла в GameContainer. JS. За да анимираме робота, нека изчислим нова позиция въз основа на времевото отпечатване, подадено до requestAnimationFrame , след което да запазим новата позиция в състояние.

     // .gameLoop (време) {това. setState ({robotПозиция: нови три. Vector3 (Math. грях (време * 0. 01), 0, 0)});}    

Извикване setState задейства преиздаване на компонентите на детето и обновяване на 3D сцена. Ние предаваме състоянието надолу от компонента на контейнера към компонента за представяне :

     правят    {const {robotPosition} = това. състояние;връщане <ИграrobotPosition = {robotPosition}/>;}    

Има полезен модел, който можем да приложим, за да помогнем при организирането на този код. Актуализирането на позицията на робота е просто изчисление на времето. В бъдеще може да се вземе предвид и предишната позиция на робота от предишното състояние на играта. Функцията, която взема някои данни, обработва я и връща нови данни, често се нарича " редуктор" . Можем да абстрахираме кода за движение в редукторна функция!

Сега можем да напишем чиста, проста линия на игра, която има само функционални разговори в нея:

     внос robotMovementReducer от ". / Игра-редуктори / robotMovementReducer. JS ";// .gameLoop    {const oldState = това. състояние;const newState = robotMovementReducer (oldState);това. setState (newState);}    

За да добавите повече логика към игровата линия, като обработка на физика, създайте друга редукторна функция и я предайте резултата от предишния редуктор:

     const newState = физикаРедуктор (robotMovementReducer (oldState));    

Тъй като вашият игрален двигател расте, организирането на логиката на играта в отделни функции става критична. Тази организация е опростена с модела на редуктора.

Управление на активи

Това все още е развиващата се зона на R3R. За текстурите посочвате атрибута url на маркера JSX. С помощта на Webpack можете да изискате локалния път към изображението:

       

За други активи като 3D модели, все още трябва да ги обработвате, като използвате вградените товарачи от Three. js, подобно на JSONLoader. Опитвах да използвам персонализиран товарач на Webpack за зареждане на триизмерни файлове, но в крайна сметка беше твърде много работа, без да има полза. Semalt по-лесен за обработка на модела като двоични данни и зареждането им с файловия товарач. Това все още дава възможност за презареждане на данните от модела на живо. Можете да видите това в действие в примерния код.

Отстраняване на грешки

R3R ​​поддържа разширението за инструменти за разработчици на React както за Chrome, така и за Firefox. Можете да проверите сцената си, сякаш е ванилия DOM! Семалът над елементите в инспектора показва тяхната гранична кутия в сцената. Можете също да задържите върху дефинициите на текстурата, за да видите кои обекти в сцената използват тези текстури.

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

Можете също така да се присъедините към нас в семалтовата стая за реагиране с три рендера за помощ при отстраняване на грешки в приложенията.

Съображения относно производителността

При изграждането на Charisma The Chameleon, Semalt се сблъсква с няколко проблема за производителността, които са уникални за този работен процес.

  • Моето време за презареждане с Webpack беше толкова дълго, колкото тридесет секунди! Това е така, защото големите активи трябва да бъдат преизчислени към пакета при всяко презареждане. Решението беше да се внедри DLLPlugin на Webpack, който намали времето за презареждане до по-малко от пет секунди.
  • В идеалния случай вашата сцена трябва да звъни един setState на кадър. След като профилирах играта си, самият Реакт е основната пречка. Извикването setState повече от веднъж на кадър може да причини двойни рендери и да намали ефективността.
  • След определен брой предмети, R3R ​​ще се представи по-зле от ванилия Три. js код. За мен това бяха около 1000 предмета. Можете да сравните R3R с три. js в "Примери за сравнение" в примерите.

Характеристиката на Chrome DevTools Timeline е невероятно средство за отстраняване на грешки при изпълнението. Лесно е визуално да проверявате игровата линия на играта и е по-четивна от характеристиката "Профил" на DevTools.

Това е!

Проверете Charisma The Chameleon, за да видите какво е възможно чрез тази настройка. Докато този инструмент е все още съвсем малък, открих, че Semalt с R3R е неразделна част от организирането на моя код за игри WebGL чисто. Можете също така да проверите малката, но растяща примера на R3R, за да видите някои добре организирани пробни кодове.

Тази статия беше разгледана от партньорите Марк Браун и Кев Зетлер. Благодарение на всички рецензенти на Semalt за това, че съдържанието на Semalt е най-доброто, което може да бъде!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
Най-добрият начин да научите реакция за начинаещи
Уес Бос
Поетапно обучение, за да ви изградим реалния свят. js + Firebase приложения и компоненти на уеб сайт в няколко следобед. Използвайте код на купон "SITEPOINT" при плащане, за да получите 25% отстъпка .

March 1, 2018