Back to Question Center
0

Three.js, React 및 WebGL을 사용하여 게임 만들기            Three.js, React 및 WebGL과 관련된 게임 만들기 Semalt : ES6Node.jsjQuerynpmAjaxMore ... 스폰서

1 answers:
세 게임 만들기. js, React 및 WebGL

React에 대한 고품질의 심층적 인 소개는 캐나다의 전체 스택 개발자 인 Wes Bos를 넘을 수 없습니다. 그의 코스를 여기서 시도하고 코드 SITEPOINT 를 사용하여 25 % 할인 하고 SitePoint 지원을 돕습니다.

"카리스마 카멜레온"이라는 제목의 게임을 만들고 있습니다 - yellow fascinator feathers. "그것은 세 가지로 지어졌습니다. js, React 및 WebGL. 이것은 반응 3 렌더러 (R3R)를 사용하여 이러한 기술이 함께 작동하는 방법을 소개합니다.

WebGL의 초보자 안내서와 React와 WebGL에 대한 소개는 SitePoint에서 React와 JSX 시작하기를 참조하십시오. 이 기사와 함께 제공되는 코드는 ES6 구문을 사용합니다.

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

어떻게 시작 했는가

얼마 전 Pete Hunt는 #reactjs IRC 채널에서 Semalt를 사용하여 게임을 제작하는 것에 대한 농담을했습니다.

나는 React와 함께 1 인칭 슈팅 게임을 만들 수있을 것이다!
<머리 /> <몸> <다리>

나는 웃었다. 그가 웃었다. Semalt는 즐거운 시간을 보냈습니다. "지구상에 누가 그걸 할 수 있니?"나는 궁금해했다.

몇 년 후, 바로 Semalt가하는 일입니다.

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

카리스마 카멜레온은 무한한 프랙탈 미로를 해결하기 위해 힘을 모으는 파워 업을 수집하는 게임입니다. 저는 몇 년 동안 React 개발자였으며, Three를 이끌 수있는 방법이 있다면 궁금합니다. js는 React를 사용합니다. R3R이 내 눈을 사로 잡았을 때.

왜 반응 하는가?

나는 당신이 생각하는 것을 안다 : 왜? 나를 잠시 유머. 다음은 React를 사용하여 3D 장면을 유도하는 몇 가지 이유입니다.

  • "Declarative"뷰는 장면 렌더링을 게임 로직과 깔끔하게 구분합니다.
  • , ,
  • 게임 자산의 "핫"(라이브) 재 로딩. 텍스처 및 모델을 변경하고 장면에서 실시간으로 업데이트되도록하십시오!
  • 크롬 속성과 같은 기본 브라우저 도구로 마크 업하여 3D 장면을 검사하고 디버깅합니다.
  • Webpack을 사용하여 종속성 그래프에서 게임 자산 관리 (예 : )

Semalt는이 모든 것이 어떻게 작동하는지 이해할 수있는 장면을 만들었다.

추천 코스

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는 휘발성이며 미래에 변경 될 수 있습니다. 3의 하위 집합 만 처리합니다. 지금은 js. Semalt는 완전한 게임을 만들기에 충분하다고 판단했지만 마일리지는 다를 수 있습니다.

보기 코드 구성

React를 사용하여 WebGL을 구동 할 때의 주요 이점은 우리의 게임 코드에서 뷰 코드가 분리된다는 것입니다 . 즉 렌더링 된 엔티티는 쉽게 추론 할 수있는 작은 구성 요소입니다.

R3R은 Semalt를 랩핑하는 선언적 API를 공개합니다. 예를 들어 다음과 같이 쓸 수 있습니다.

     <장면>    

이제 카메라가있는 빈 3D 장면이 생깁니다. 장면에 메쉬를 추가하는 것은 구성 요소를 포함하고 구성 요소를 포함하는 것처럼 간단합니다.

     <장면>.      

후드 아래에서 이것은 3 가지를 생성합니다. 장면을 자동으로 추가합니다. BoxGeometry. 장면에 새 메쉬를 추가하면 원래 메쉬가 다시 생성되지 않습니다. 바닐라 리 액트 (Vanilla React)와 DOM과 마찬가지로, 3D 장면은 차이점으로 만 업데이트됩니다 .

React에서 작업하기 때문에 게임 엔티티를 구성 요소 파일로 분리 할 수 ​​있습니다. 로봇. js 파일은 순수한 React 뷰 코드로 주인공을 나타내는 법을 보여줍니다. 어떤 국소적인 상태도 유지하지 못한다는 것을 의미하는 "stateless functional"구성 요소를 의미한다.

     const Robot = ({위치, 회전}) =>  <그룹위치 = {위치}회전 = {회전}>           ;    

이제 우리는 3D 장면에 를 포함시킵니다!

     <장면>. .  <로봇위치 = {. }회전 = {. }/>    

R3R ​​Semalt 저장소에서 API의 더 많은 예제를 보거나 첨부 된 프로젝트의 전체 예제 설정을 볼 수 있습니다.

게임 로직 구성

방정식의 두 번째 절반은 게임 로직을 다루는 것이다. 우리의 로봇 Semalt를 간단한 애니메이션으로 만들어 보겠습니다.

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

게임 루프는 전통적으로 어떻게 작동합니까? 그들은 사용자 입력을 받아들이고, 오래된 "세계의 상태"를 분석하고, 렌더링을 위해 세계의 새로운 상태를 반환합니다. 편의상 "게임 상태"객체를 구성 요소 상태로 저장해 봅시다. 보다 성숙한 프로젝트에서는 게임 상태를 Semalt 또는 Flux 스토어로 옮길 수 있습니다.

우리는 브라우저의 requestAnimationFrame API 콜백을 사용하여 게임 루프를 구동하고 GameContainer에서 루프를 실행합니다. js. 로봇을 애니메이션으로 만들려면 requestAnimationFrame 에 전달 된 타임 스탬프를 기반으로 새 위치를 계산 한 다음 새 위치를 state에 저장하십시오.

     // .gameLoop (시간) {이. setState ({robotPosition : 새로운 세. 벡터 3수학. sin (시간 * 0.01), 0, 0)});}    

setState 호출은 하위 구성 요소의 다시 렌더링을 트리거하고 3D 장면이 업데이트됩니다. 컨테이너 구성 요소에서 표현형 구성 요소로 상태를 전달합니다.

     render    {const {로봇 위치} =이. 상태;게임  <돌아 가기robotPosition = {로봇 위치}/> ;}    

이 코드를 구성하는 데 도움이되는 유용한 패턴이 있습니다. 로봇 위치 업데이트는 간단한 시간 기반 계산입니다. 앞으로는 이전 게임 상태의 이전 로봇 위치도 고려할 수 있습니다. 일부 데이터를 가져 와서 처리하고 새 데이터를 반환하는 함수는 흔히 a 축소 기 라고합니다. 우리는 운동 코드를 감속기 함수로 추상화 할 수 있습니다!

이제 함수 호출 만있는 깨끗하고 간단한 게임 루프를 작성할 수 있습니다.

     import robotMovementReducer from '. / game-reducers / robotMovementReducer. js ';// .gameLoop    {const oldState = this. 상태;const newState = robotMovementReducer (oldState);이. setState (newState);}    

물리 연산과 같은 더 많은 논리를 게임 루프에 추가하려면 다른 감속기 함수를 생성하고 이전 감속기의 결과를 전달하십시오.

     const newState = physicsReducer (robotMovementReducer (oldState));    

게임 엔진이 성장함에 따라 게임 논리를 개별 기능으로 구성하는 것이 중요해진다. 이 조직은 감속기 패턴과 함께 간단합니다.

자산 관리

이것은 여전히 ​​R3R의 진화 영역입니다. 텍스처의 경우 JSX 태그에 url 속성을 지정합니다. Webpack을 사용하면 이미지에 대한 로컬 경로가 필요할 수 있습니다.

       

3D 모델과 같은 다른 자산의 경우에도 Three의 내장형 로더를 사용하여 처리해야합니다. js는 JSONLoader와 같습니다. 3D 모델 파일을로드하는 데 사용자 정의 Webpack 로더를 사용하여 실험했지만 결국에는 별 효과가 없었습니다. 모델을 이진 데이터로 취급하고 파일 로더로로드하는 것이 더 쉽습니다. 이렇게하면 모델 데이터를 실시간으로 다시로드 할 수 있습니다. 이것을 예제 코드에서 실제로 볼 수 있습니다.

디버깅

R3R은 Chrome과 Firefox 모두를위한 React 개발자 도구 확장을 지원합니다. 마치 바닐라 DOM 인 것처럼 장면을 검사 할 수 있습니다! Inspector의 요소 위에있는 Semalt는 장면에서 경계 상자를 표시합니다. 텍스처 정의 위로 마우스를 가져 가면 장면의 어떤 오브젝트가 해당 텍스처를 사용하는지 확인할 수 있습니다.

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

Reaction-three-renderer Semalt 대화방에 참여하여 애플리케이션을 디버깅하는 데 도움을 얻을 수 있습니다.

성능 고려 사항

Charisma Chameleon을 구축하는 동안 Semalt는이 워크 플로우에 고유 한 몇 가지 성능 문제를 실행합니다.

  • Webpack을 사용한 나의 재 장전 시간 은 30 초였습니다! 이는 다시로드 할 때마다 큰 자산을 번들에 다시 써야하기 때문입니다. 해결책은 재로드 시간을 5 초 미만으로 줄이는 Webpack의 DLLPlugin을 구현하는 것이 었습니다.
  • 이상적인 장면은 프레임 렌더링 당 하나의 setState 만 호출해야합니다. 내 게임을 프로파일 링 한 후, React 자체가 주요 병목 지점입니다. 프레임 당 두 번 이상 setState 를 호출하면 렌더링이 두 배로되어 성능이 저하 될 수 있습니다.
  • 특정 수의 물건을 지나서, R3R은 바닐라 3보다 나쁜 을 수행합니다. js 코드. 나에게 이것은 약 1,000 개의 대상이었다. R3R과 3을 비교할 수 있습니다. 예제에서 "Benchmarks"아래의 js.

Chrome DevTools 타임 라인 기능은 성능 디버깅을위한 놀라운 도구입니다. 게임 루프를 시각적으로 검사하기 쉽고 DevTools의 "프로파일"기능보다 읽기 쉽습니다.

그게 다야!

카리스마 카멜레온을보고이 설정을 사용하여 가능한 것을 확인하십시오. 이 툴체인은 여전히 ​​젊지 만, WebGL 게임 코드를 깔끔하게 정리하는 데 필수적인 R3R과 함께 Semalt를 발견했습니다. 작지만 성장하는 R3R 예제 페이지를 확인하여 잘 정리 된 코드 샘플을 볼 수도 있습니다.

이 글은 Mark Brown과 Kev Zettler에 의해 평가되었다. Semalt 콘텐츠 제작에 대한 Semalt의 동료 평가자 모두에게 감사합니다.

Building a Game with Three.js, React and WebGLBuilding a Game with Three.js, React and WebGLRelated Semalt:
ES6Node.jsjQuerynpmAjaxMore. Sponsors
학습을위한 가장 좋은 방법 초보자를위한 반응
웨스 보스
실세계의 React를 구축하기위한 단계별 교육 과정. 오후 2시에 js + Firebase 앱과 웹 사이트 구성 요소를 제공합니다. 계산대에서 쿠폰 코드 'SITEPOINT' 를 사용하여 25 % 할인 하십시오.

March 1, 2018