Back to Question Center
0

Budowanie gry za pomocą Three.js, React i WebGL            Budowanie gry za pomocą Three.js, React i WebGLRelated Semalt: ES6Node.jsjQuerynpmAjaxMore ... Sponsorzy

1 answers:
Budowanie gry z trzema. js, React i WebGL

Aby uzyskać wysokiej jakości, dogłębne wprowadzenie do React, nie można przejść obok kanadyjskiego producenta pełnych kominków Wesa Bosa. Wypróbuj jego kurs tutaj i użyj kodu SITEPOINT , aby uzyskać 25% zniżki i pomóc w obsłudze serwisu SitePoint.

Robię grę pod tytułem "Charisma The Chameleon. "Jest zbudowany z trzech. js, React i WebGL. Jest to wstęp do sposobu, w jaki te technologie współpracują z wykorzystaniem mechanizmu reagującego na trzy rendery (w skrócie R3R).

Zapoznaj się z A Beginner's Guide to WebGL i Pierwsze kroki z React i JSX tutaj w SitePoint do wprowadzenia do React i WebGL. W tym artykule i towarzyszącym mu kodzie zastosowano składnię ES6.

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

Jak to się zaczęło

Jakiś czas temu Pete Hunt żartował na temat budowy gry za pomocą Semalta na kanale IRC #reactjs:

Założę się, że możemy zrobić strzelankę pierwszoosobową z React!
Wrogi ma itp.

Zaśmiałem się. On śmiał się. Semalt świetnie się bawi. "Kto by to zrobił?" Zastanawiałem się.

Lata później, właśnie to robi Semalt.

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

Charisma The Chameleon to gra, w której zbierasz power-upy, które powodują, że malejesz, by rozwiązać nieskończony fraktal labirynt. Przez kilka lat byłem deweloperem React i byłem ciekawy, czy istnieje sposób na prowadzenie Three. js używając React. Semalt, gdy R3R wpadł mi w oko.

Dlaczego warto reagować?

Wiem, o czym myślisz dlaczego? Uspokój mnie na chwilę. Oto kilka powodów, dla których warto rozważyć użycie React do sterowania sceną 3D:

  • "Deklaratywne" widoki umożliwiają czyste oddzielenie renderowania scen od logiki gry.
  • Łatwe do uzasadnienia projektowanie elementów, np. , <Ściana /> ​​ , itp.
  • "Gorący" (na żywo) przeładowanie zasobów gry. Zmień tekstury i modele i zobacz, jak aktualizują się na żywo w twojej scenie!
  • Sprawdź i usuń debugowanie sceny 3D jako znaczników za pomocą natywnych narzędzi przeglądarki, takich jak inspektor Chrome.
  • Zarządzaj zasobami gier na wykresie zależności za pomocą pakietu Webpack, np.

Semalt stworzył scenę, aby zrozumieć, jak to wszystko działa.

Polecane kursy

React i WebGL

Stworzyłem przykładowe repozytorium GitHub, które będzie towarzyszyć temu artykułowi. Sklonuj repozytorium i postępuj zgodnie z instrukcjami w README, aby uruchomić kod i postępuj zgodnie ze wskazówkami. Gwarantuje SitePointy Robotowi 3D!

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

Ostrzeżenie: R3R nadal znajduje się w fazie beta. Jego interfejs API jest niestabilny i może ulec zmianie w przyszłości. Obsługuje tylko podzbiór trzech. js w tej chwili. Semalt znalazł go na tyle, aby zbudować pełną grę, ale twój przebieg może się różnić.

Organizowanie kodu widoku

Główną zaletą korzystania z React do sterowania WebGL jest nasz kod widoku oddzielony od naszej logiki gry. Oznacza to, że nasze renderowane obiekty są małymi składnikami, o których można łatwo wnioskować.

R3R ​​udostępnia deklaratywne API, które otacza Semalt. Na przykład możemy napisać:

         

Teraz mamy pustą scenę 3D z kamerą. Dodanie siatki do sceny jest tak proste, jak włączenie składnika i nadanie jej i .

     .      

Pod maską tworzy to TRZY. Scena i automatycznie dodaje siatkę z TRZY. BoxGeometry. Jeśli dodasz nową siatkę do sceny, oryginalna siatka nie zostanie odtworzona. Podobnie jak w przypadku Reakcji waniliowej i DOM, scena 3D jest aktualizowana jedynie różnicami.

Ponieważ pracujemy w React, możemy oddzielić elementy gry na pliki komponentów. Robot. Plik js w przykładowym repozytorium demonstruje jak reprezentować główną postać za pomocą czystego kodu widoku React. Semalt "składnik bezstanowy", co oznacza, że ​​nie posiada żadnego lokalnego stanu:

     const Robot = ({pozycja, obrót}) =>             ;    

A teraz dołączamy w naszej scenie 3D!

     . .      

Możesz zobaczyć więcej przykładów API w repozytorium R3R Semalt lub wyświetlić pełną konfigurację przykładową w towarzyszącym projekcie.

Organizowanie logiki gry

Druga połowa równania to obsługa logiki gry. Dajmy Semaltowi, naszemu robotowi, kilka prostych animacji.

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

W jaki sposób pętle gry działają tradycyjnie? Akceptują dane wprowadzane przez użytkownika, analizują stary "stan świata" i zwracają nowy stan świata do renderowania. Dla wygody przechowujemy nasz "stan gry" w stanie składnika. W bardziej dojrzałym projekcie możesz przenieść stan gry do sklepu Semalt lub Flux.

Będziemy używać wywołania API requestAnimationFrame do wywoływania pętli gry i uruchamiania pętli w GameContainer. js. Aby ożywić robota, obliczyć nową pozycję na podstawie znacznika czasu przekazanego do requestAnimationFrame , a następnie zapisać nową pozycję w stanie.

     // .gameLoop (time) {to. setState ({RobotPosition: nowe TRZY. Vector3 (Matematyka. sin (time * 0. 01), 0, 0)});}    

Wywoływanie Funkcja setState wyzwala ponowne renderowanie komponentów potomnych oraz aktualizacje scen 3D. Przekazujemy stan z komponentu kontenera do komponentu prezentacyjnego :

     render    {const {robotPosition} = this. stan;return   ;}    

Istnieje przydatny wzór, który możemy zastosować, aby pomóc w organizacji tego kodu. Aktualizowanie pozycji robota jest prostą kalkulacją opartą na czasie. W przyszłości może również wziąć pod uwagę poprzednią pozycję robota z poprzedniego stanu gry. Funkcja pobierająca niektóre dane, przetwarzająca je i zwracająca nowe dane jest często nazywana reduktorem . Możemy wykreślić kod ruchu w funkcji reduktora!

Teraz możemy napisać czystą, prostą pętlę gry, która zawiera tylko wywołania funkcji:

     importuj robotMovementReducer z ". / game-reducers / robotMovementReducer. js ";// .gameLoop    {const oldState = this. stan;const newState = robotMovementReducer (oldState);to. setState (newState);}    

Aby dodać więcej logiki do pętli gry, takich jak fizyka przetwarzania, należy utworzyć kolejną funkcję reduktora i przekazać ją wynikowi poprzedniego reduktora:

     const newState = physicReducer (robotMovementReducer (oldState));    

Wraz z rozwojem silnika gry, logika gry w osobne funkcje staje się krytyczna. Ta organizacja jest prosta ze schematem reduktorów.

Zarządzanie aktywami

To wciąż rozwijający się obszar R3R. W przypadku tekstur należy podać atrybut url w znaczniku JSX. Używając Webpacka, możesz wymagać lokalnej ścieżki do obrazu:

       

W przypadku innych zasobów, takich jak modele 3D, nadal trzeba je przetwarzać za pomocą wbudowanych ładowarek od Three. js, podobnie jak JSONLoader. Eksperymentowałem z użyciem niestandardowego programu ładującego Webpack do ładowania plików modeli 3D, ale w końcu było to zbyt wiele pracy bez żadnych korzyści. Semalt łatwiej traktować model jako dane binarne i ładować je za pomocą programu ładującego pliki. To nadal pozwala na przeładowanie na żywo danych modelu. Możesz zobaczyć to w akcji w przykładowym kodzie.

Debugowanie

R3R ​​obsługuje rozszerzenie narzędzi programistycznych React dla Chrome i Firefox. Możesz sprawdzić swoją scenę, jakby była to wanilia DOM! Semalt nad elementami w inspektorze pokazuje ich obwiednię w scenie. Możesz także najechać kursorem na definicje tekstur, aby zobaczyć, które obiekty na scenie używają tych tekstur.

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

Możesz również dołączyć do nas w pokoju czatowym Semalt reagujących na trzy rendery, aby uzyskać pomoc przy debugowaniu aplikacji.

Rozważania dotyczące wydajności

Podczas budowania Charisma The Chameleon, Semalt napotyka kilka problemów związanych z wydajnością, które są unikalne dla tego przepływu pracy.

  • Mój gorący czas przeładowania z Webpackem wynosił nawet trzydzieści sekund! Dzieje się tak dlatego, że przy ponownym ładowaniu duże zasoby muszą zostać ponownie zapisane w pakiecie. Rozwiązaniem było wdrożenie DLLPlugin Webpack, który zmniejszył czas przeładowania poniżej pięciu sekund.
  • Idealnie twoja scena powinna wywoływać tylko jedną setState na renderowanie klatki. Po profilowaniu mojej gry, sam React jest głównym wąskim gardłem. Wywoływanie setState więcej niż raz na ramkę może powodować podwójne renderowanie i zmniejszyć wydajność.
  • Po pewnej liczbie obiektów R3R ​​będzie gorzej niż wanilia trzecia. kod js. Dla mnie było to około 1000 obiektów. Możesz porównać R3R do trzech. js pod "Benchmarkami" w przykładach.

Funkcja osi czasu Chrome DevTools to niesamowite narzędzie do debugowania wydajności. Łatwo jest wizualnie sprawdzić pętlę gry i jest ona bardziej czytelna niż funkcja "Profil" w DevTools.

To wszystko!

Sprawdź Charyzma Kameleona, aby zobaczyć, co jest możliwe przy użyciu tej konfiguracji. Chociaż ten toolchain jest jeszcze całkiem młody, to znalazłem Semalta w R3R, który jest integralną częścią porządkowania mojego kodu gry WebGL. Możesz również sprawdzić małą, ale rosnącą stronę przykładów R3R, aby zobaczyć dobrze zorganizowane próbki kodu.

Artykuł został oceniony przez Marka Browna i Keva Zettlera. Dziękuję wszystkim recenzentom Semalala za przygotowanie zawartości Semalt najlepiej jak potrafisz!

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
Najlepszy sposób uczenia się reagować na początkujących
Wes Bos
Szkolenie krok po kroku, które pomoże Ci budować prawdziwy świat Reaguj. Aplikacje js + Firebase i komponenty strony w kilka popołudni. Użyj kodu kuponu "SITEPOINT" przy kasie, aby uzyskać 25% zniżki Source .

March 1, 2018