検索
ホームページウェブフロントエンドjsチュートリアルThree.js、React、WebGLでゲームを構築します

Building a Game with Three.js, React and WebGL

コアポイント

  • ゲーム開発で3Dシーンを駆動するためにReactを使用して、ゲームロジックからのシーンレンダリングの明確な分離、理解しやすいコンポーネント、ゲームリソースのリアルタイムのリロード、ネイティブブラウザーツールを使用する機能など、多くの利点があります。 3Dシーンは、マーカーとしてチェックしてデバッグします。
  • React-Three-Renderer(R3R)は、Three.jsをカプセル化する宣言APIを提供し、ゲームロジックからビューコードを切り離し、小さくて理解しやすいコンポーネントを作成します。
  • ゲームエンジンが成長するにつれて、還元モードを使用してゲームロジックを個別の関数に整理することが重要です。このモードにより、クリーンでクリアなゲームループを作成し、ゲームループにロジックを簡単に追加できます。
  • 排水とパフォーマンスの考慮事項は、Three.js、React、WebGLを使用したゲームの構築においてユニークです。 Chrome Devtoolsのタイムライン機能を使用することは、パフォーマンスをデバッグするために非常に貴重であり、Reactの再レンダーの数を最小限に抑えるなどの戦略を実装することで、パフォーマンスを最適化するのに役立ちます。

「Chameleon Charm」と呼ばれるゲームを作成しています。 Three.js、React、およびWebGLを使用して構築されています。この記事では、これらのテクノロジーがReact-3reレンダラー(R3Rと略された)を使用してどのように連携するかについて説明します。

webgl Getting Geter GuideとReactとJSX Gets Gets Gets SitePointのガイドをチェックして、ReactとWebGLの紹介をご覧ください。この記事と添付のコードは、ES6構文を使用します。

Building a Game with Three.js, React and WebGL

すべての始まり

しばらく前、ピート・ハントは#ReactJS IRCチャンネルで冗談を言って、彼がReactを使用してゲームを作成すると言っています:

私たちはReactで一人称シューティングゲームを作ることができるに違いありません!敵は

を持っています

など。私は微笑んだ。彼も笑った。誰もが素晴らしい時間を過ごしました。 「世界の誰がこれをするだろうか?」

数年後、私はまさにこれをしました。

Building a Game with Three.js, React and WebGL

Chameleon Charmは、無限のフラクタル迷路を解決するために絞り込むことができる拡張された小道具を収集するゲームです。私は数年間React開発者として働いてきましたが、Reactを使用してThree.jsを駆動する方法があるかどうか知りたいです。この時点で、R3Rは私の注意を引きました。

なぜ反応を選ぶのですか?

私はあなたが何を考えているのか知っています:なぜですか?説明させてください。 Reactを使用して3Dシーンを駆動することを検討する理由は次のとおりです。

  • 「宣言的」ビューでは、ゲームロジックからレンダリングを明確に分離できます。
  • <player></player><wall></wall><level></level>などの簡単なコンポーネントを設計します。
  • 「ホット」(リアルタイム)ゲームリソースのリロード。テクスチャとモデルを変更し、シーンでリアルタイムで更新を確認してください!
  • Chrome Inspectorなどのネイティブブラウザーツールを使用したタグとして3Dシーンをチェックおよびデバッグします。
  • Webパックを使用して依存関係グラフでゲームリソースを管理します <texture require="" src="%7B"></texture>
  • シナリオを設定して、これがすべて機能する方法を確認しましょう。

Reactとwebgl

この記事で動作するサンプルGithubリポジトリを作成しました。リポジトリをクローンし、READMEのようにコードを実行し、学習を続けます。メインキャラクターとしてSitePointy 3Dロボットを備えています!

Building a Game with Three.js, React and WebGL

警告:R3Rはまだテスト段階にあります。そのAPIは不安定であり、将来変化する可能性があります。現在、Three.jsのサブセットのみを処理しています。完全なゲームを構築するのに十分なほど完了しましたが、結果は異なる場合があります。

編成コードを表示

Reactを使用してWebGLを駆動する主な利点は、ビューコードがゲームロジックから切り離されていることです。これは、私たちがレンダリングするエンティティが小さく、理解しやすいコンポーネントであることを意味します。

R3Rは、3つのjsをカプセル化する宣言APIを公開します。たとえば、次のように書くことができます

今、カメラ付きの空の3Dシーンがあります。シーンにメッシュを追加することは、A コンポーネントを含めることと

のコンポーネントを提供するのと同じくらい簡単です。
<code><scene>></scene>
  <perspectivecamera>    position={ new THREE.Vector3( 1, 1, 1 )
  />
>
</perspectivecamera></code>

<mesh></mesh>舞台裏では、3.sceneを作成し、3.boxgeometryのグリッドを自動的に追加します。 R3Rは、古いシーンと変更の違いを処理します。シーンに新しいメッシュを追加すると、元のメッシュが再現されません。通常のReactとDOMを使用するのと同じように、3Dシーンは違いを更新します。 <geometry></geometry> <material></material>私たちはReactで作業しているため、ゲームエンティティをコンポーネントファイルに取り外すことができます。サンプルリポジトリのrobot.jsファイルは、純粋な反応ビューコードを使用して主要な役割を表す方法を示しています。これは「ステートレス関数」コンポーネントです。つまり、地元の状態を節約しないことを意味します。

<code><scene>></scene>
  …
  <mesh>></mesh>
    <boxgeometry></boxgeometry>      width={ 1 }
      height={ 1 }
      depth={ 1 }
    />
    <meshbasicmaterial></meshbasicmaterial>      color={ 0x00ff00 }
    />
>
</code>
3Dシーンに

を含めます!

R3R GitHubリポジトリでより多くのAPI例を表示するか、付属プロジェクトの完全なサンプル設定を表示できます。
<code>const Robot = ({ position, rotation }) => <group></group>  position={ position }
  rotation={ rotation }
>
  <mesh> rotation={ localRotation }></mesh>
    <geometryresource></geometryresource>      resourceId="robotGeometry"
    />
    <materialresource></materialresource>      resourceId="robotTexture"
    />
  >
>;
</code>
ゲームロジックの整理

<robot></robot>方程式の残りの半分は、ゲームロジックを処理することです。ロボットのSitePointyにいくつかの簡単なアニメーションを追加しましょう。

<code><scene>></scene>
  …
  <mesh>></mesh>…>
  <robot></robot>    position={…}
    rotation={…}
  />
>
</code>

従来のゲームループはどのように機能しますか?彼らはユーザーの入力を受け入れ、古い「世界状態」を分析し、レンダリングのために新世界の状態に戻ります。便宜上、コンポーネント状態に「ゲーム状態」オブジェクトを保存しましょう。より成熟したプロジェクトでは、ゲーム状態をReduxまたはFluxストレージに移動できます。

ブラウザのrequestAnimationFrameAPIコールバックを使用して、ゲームループを駆動し、ループをGameContainer.jsで実行します。ロボットをアニメーションするには、requestAnimationFrameに渡されたタイムスタンプに基づいて新しい場所を計算し、州に新しい場所を保存しましょう。

<code><scene>></scene>
  <perspectivecamera>    position={ new THREE.Vector3( 1, 1, 1 )
  />
>
</perspectivecamera></code>

呼び出しsetState()は、子コンポーネントの再レンダーをトリガーし、3Dシーンを更新します。コンテナコンポーネントからデモコンポーネントに状態を渡します:<game></game>

<code><scene>></scene>
  …
  <mesh>></mesh>
    <boxgeometry></boxgeometry>      width={ 1 }
      height={ 1 }
      depth={ 1 }
    />
    <meshbasicmaterial></meshbasicmaterial>      color={ 0x00ff00 }
    />
>
</code>
このコードを整理するのに役立つ便利なパターンを適用できます。ロボットの場所を更新することは、単純な時間ベースの計算です。将来的には、以前のゲーム状態からの以前のロボットの場所を考慮することもできます。一部のデータを受け入れ、それを処理し、新しいデータを返す関数は、多くの場合、減速機と呼ばれます。移動コードを削減機能に抽象化できます!

機能呼び出しのみを含む簡潔でクリアなゲームループを書くことができます:

物理学の取り扱いなど、ゲームループにロジックを追加するには、別の還元剤関数を作成し、以前の削減の結果に渡す:
<code>const Robot = ({ position, rotation }) => <group></group>  position={ position }
  rotation={ rotation }
>
  <mesh> rotation={ localRotation }></mesh>
    <geometryresource></geometryresource>      resourceId="robotGeometry"
    />
    <materialresource></materialresource>      resourceId="robotTexture"
    />
  >
>;
</code>

ゲームエンジンの成長として、ゲームロジックを個別の関数に整理することが重要になります。還元モードを使用して、この組織は非常に簡単です。
<code><scene>></scene>
  …
  <mesh>></mesh>…>
  <robot></robot>    position={…}
    rotation={…}
  />
>
</code>

リソース管理

これはまだR3Rの開発分野です。テクスチャの場合、JSXタグにURLプロパティを指定できます。 webpackを使用して、ローカル画像パスを尋ねることができます:

この設定では、ディスク上の画像を変更すると、3Dシーンがリアルタイムで更新されます!これは、ゲームのデザインとコンテンツを迅速に繰り返すために非常に貴重です。

<code>// …
gameLoop( time ) {
  this.setState({
    robotPosition: new THREE.Vector3(
      Math.sin( time * 0.01 ), 0, 0
    )
  });
}
</code>
他のリソース(3Dモデルなど)の場合、3.jsのビルトインローダー(JSONLoaderなど)を使用してそれらを処理する必要があります。カスタムWebpackローダーを使用して3Dモデルファイルをロードしようとしましたが、あまりにも多くの作業と利点がありませんでした。モデルをバイナリデータと考え、ファイルローダーを使用してロードする方が簡単です。これにより、モデルデータのリアルタイム過負荷を実装できます。これをサンプルコードで見ることができます。

debug

R3Rは、ChromeとFirefoxのReact Developer Tool拡張機能をサポートしています。通常のDOMをチェックするように、シーンを確認できます!インスペクターの要素の上にホバリングすると、シーンに境界のあるボックスが表示されます。テクスチャ定義の上にホバリングして、シーン内のどのオブジェクトがこれらのテクスチャを使用しているかを確認することもできます。

アプリケーションのデバッグを支援するために、React-Three-Renderer Gitterチャットルームに参加することもできます。 Building a Game with Three.js, React and WebGL

パフォーマンス予防策カメレオンチャームを構築するとき、このワークフローに固有のパフォーマンスの問題に遭遇しました。

最大30秒のホットリロード時間にWebpackを使用します!これは、各過負荷がパッケージに大きなリソースを書き込む必要があるためです。解決策は、WebpackのDllPluginを実装することです。これにより、リロード時間が5秒未満に短縮されます。
  • 理想的には、シーンはレンダリングのフレームごとに1回だけ呼ばれる必要があります。私のゲームを分析した後、React自体がメインのボトルネックです。フレームごとに複数回
  • を呼び出すと、二重のレンダリングと劣化性能が発生します。
  • setState()特定の数のオブジェクトを超えた後、R3Rのパフォーマンスは通常の3.jsコードよりも悪いでしょう。私にとって、それは約1000のオブジェクトです。この例の「ベンチマーク」でR3Rを3.JSと比較できます。 setState()
  • Chrome Devtoolsのタイムライン機能は、パフォーマンスをデバッグするための優れたツールです。ゲームループを簡単かつ直感的に確認できます。DevToolsの「プロフィール」機能よりも読みやすいです。
それだけです!

この設定で何ができるかを学ぶためにChameleon Charmをチェックしてください。このツールチェーンはまだ若いですが、R3Rの反応を使用することが私のWebGLゲームコードを明確に整理するために重要であることがわかりました。また、小さいながらも成長しているR3Rサンプルページをチェックして、よく組織化されたコードの例を表示することもできます。

この記事は、マーク・ブラウンとケブ・ゼトラーによって査読されました。 SetePointのすべてのピアレビューアーズに感謝します。

ReactJSとWebGLを使用してゲームを構築するためのFAQ ReactJとWebGLを使用してゲームを構築するための前提条件は何ですか?

ReactJとWebGLでゲームを構築するには、JavaScript、HTML、およびCSSの基本的な理解が必要です。また、ReactJS(ユーザーインターフェイスを構築するための一般的なJavaScriptライブラリ)を知る必要があります。さらに、インタラクティブな3Dおよび2DグラフィックをレンダリングするためのJavaScript APIであるWebGL(Webグラフィックライブラリ)を理解することが重要です。また、ES6構文、NPM(ノードパッケージマネージャー)、およびコマンドラインに精通することは大きな利点になります。

unityをReactJと統合する方法は?

unityは、React-Unity-Webglパッケージを使用してReactJSと統合できます。このパッケージを使用すると、unity webglビルドをReactJSアプリケーションに埋め込むことができます。 NPMを使用してインストールして、プロジェクトにインストールできます。その後、パッケージが提供するUnityコンポーネントを使用して、UnityゲームをReactJSアプリケーションに埋め込むことができます。

Reactを使用して3Dアプリケーションを作成するさまざまな方法は何ですか?

Reactを使用して3Dアプリケーションを作成する方法はいくつかあります。最も人気のある方法の1つは、アニメーション化された3Dコンピューターグラフィックを作成および表示するためのクロスブラウザーJavaScriptライブラリであるThree.jsを使用することです。別のアプローチは、WebGLを直接使用することですが、これはより複雑な場合があります。 React-3-FiberやReact-Unity-Webglなどの他のライブラリを使用して、Reactを使用して3Dアプリケーションを作成することもできます。

WebGLを使用してインタラクティブな3Dグラフィックを作成する方法は?

WebGLを使用すると、プラグインなしでブラウザで直接インタラクティブな3Dグラフィックを作成できます。 WebGLのAPIを使用して、複雑な3Dグラフィック、アニメーション、ゲームを作成できます。ただし、WebGLのAPIは低レベルであり、直接使用するのが複雑になる場合があります。したがって、多くの開発者は、WebGLにより高いレベルのインターフェイスを提供する3つのjsなどのライブラリを使用することを好みます。

ゲーム開発におけるReact-Unity-Webglの役割は何ですか?

React-Unity-Webglパッケージを使用すると、Unity WebGLビルドをReactJSアプリケーションに埋め込むことができます。これは、Unityを使用して複雑な3Dゲームを作成し、それらをReactJSアプリケーションに簡単に統合できることを意味します。これは、Webベースのゲームまたはインタラクティブな3Dアプリケーションを作成する場合に特に便利です。

パフォーマンスのためにReactJとWebGLゲームを最適化する方法は?

ReactJSとWebGLで構築されたゲームの最適化には、複数の戦略が含まれる場合があります。これらの戦略には、Reactのレレンダーの数を最小限に抑えること、WebGLの組み込みのパフォーマンス機能を使用してスムーズなアニメーションを実現し、Webの3Dモデルとテクスチャの最適化が含まれます。

requestAnimationFrameReactJとWebGLを使用してモバイルゲームを構築できますか?

はい、ReactJとWebGLを使用して、モバイルデバイスのWebブラウザーで実行されているゲームを構築できます。ただし、ネイティブモバイルゲームの場合、iOSやAndroidに直接エクスポートできるUnityやUnreal Engineなどのゲーム開発プラットフォームの使用を検討することをお勧めします。

ReactJとWebGLゲームでユーザー入力を処理する方法は?

ユーザー入力は、標準のJavaScriptイベントハンドラーを使用して、ReactJおよびWebGLゲームで処理できます。キーボード、マウス、タッチイベントを聴き、それに応じてゲームのステータスを更新できます。 ReactJSは、一貫した方法で異なるブラウザー間でユーザー入力を処理するために使用できる合成イベントも提供します。

ReactJとWebGLを使用して他のJavaScriptライブラリを使用できますか?

はい、ReactJとWebGLを使用して他のJavaScriptライブラリを使用できます。たとえば、3Dグラフィックには3D.JS、オーディオにはHowler.js、または物理処理にはMatter.jsを使用できます。重要なのは、これらのライブラリがゲームでシームレスに機能することを確認することです。

ReactJとWebGLゲームをデバッグする方法は?

ReactJとWebGLを使用して構築されたゲームは、Webブラウザーの開発者ツールを使用してデバッグできます。これらのツールを使用すると、HTML、CSS、およびJavaScriptコードを確認し、コンソールログを表示し、コードを段階的にデバッグできます。さらに、React Developer Toolsは、Reactコンポーネントの階層、小道具、および状態を確認できるブラウザ拡張機能です。

以上がThree.js、React、WebGLでゲームを構築しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
Python vs. Javascript:どの言語を学ぶべきですか?Python vs. Javascript:どの言語を学ぶべきですか?May 03, 2025 am 12:10 AM

PythonまたはJavaScriptの選択は、キャリア開発、学習曲線、エコシステムに基づいている必要があります。1)キャリア開発:Pythonはデータサイエンスとバックエンド開発に適していますが、JavaScriptはフロントエンドおよびフルスタック開発に適しています。 2)学習曲線:Python構文は簡潔で初心者に適しています。 JavaScriptの構文は柔軟です。 3)エコシステム:Pythonには豊富な科学コンピューティングライブラリがあり、JavaScriptには強力なフロントエンドフレームワークがあります。

JavaScriptフレームワーク:最新のWeb開発のパワーJavaScriptフレームワーク:最新のWeb開発のパワーMay 02, 2025 am 12:04 AM

JavaScriptフレームワークのパワーは、開発を簡素化し、ユーザーエクスペリエンスとアプリケーションのパフォーマンスを向上させることにあります。フレームワークを選択するときは、次のことを検討してください。1。プロジェクトのサイズと複雑さ、2。チームエクスペリエンス、3。エコシステムとコミュニティサポート。

JavaScript、C、およびブラウザの関係JavaScript、C、およびブラウザの関係May 01, 2025 am 12:06 AM

はじめに私はあなたがそれを奇妙に思うかもしれないことを知っています、JavaScript、C、およびブラウザは正確に何をしなければなりませんか?彼らは無関係であるように見えますが、実際、彼らは現代のウェブ開発において非常に重要な役割を果たしています。今日は、これら3つの間の密接なつながりについて説明します。この記事を通して、JavaScriptがブラウザでどのように実行されるか、ブラウザエンジンでのCの役割、およびそれらが協力してWebページのレンダリングと相互作用を駆動する方法を学びます。私たちは皆、JavaScriptとブラウザの関係を知っています。 JavaScriptは、フロントエンド開発のコア言語です。ブラウザで直接実行され、Webページが鮮明で興味深いものになります。なぜJavascrを疑問に思ったことがありますか

node.jsは、型を使用してストリーミングしますnode.jsは、型を使用してストリーミングしますApr 30, 2025 am 08:22 AM

node.jsは、主にストリームのおかげで、効率的なI/Oで優れています。 ストリームはデータを段階的に処理し、メモリの過負荷を回避します。大きなファイル、ネットワークタスク、リアルタイムアプリケーションの場合。ストリームとTypeScriptのタイプの安全性を組み合わせることで、パワーが作成されます

Python vs. JavaScript:パフォーマンスと効率の考慮事項Python vs. JavaScript:パフォーマンスと効率の考慮事項Apr 30, 2025 am 12:08 AM

PythonとJavaScriptのパフォーマンスと効率の違いは、主に以下に反映されています。1)解釈された言語として、Pythonはゆっくりと実行されますが、開発効率が高く、迅速なプロトタイプ開発に適しています。 2)JavaScriptはブラウザ内の単一のスレッドに限定されていますが、マルチスレッドおよび非同期I/Oを使用してnode.jsのパフォーマンスを改善でき、両方とも実際のプロジェクトで利点があります。

JavaScriptの起源:その実装言語の調査JavaScriptの起源:その実装言語の調査Apr 29, 2025 am 12:51 AM

JavaScriptは1995年に発信され、Brandon Ikeによって作成され、言語をCに実現しました。 2。JavaScriptのメモリ管理とパフォーマンスの最適化は、C言語に依存しています。 3. C言語のクロスプラットフォーム機能は、さまざまなオペレーティングシステムでJavaScriptを効率的に実行するのに役立ちます。

舞台裏:JavaScriptをパワーする言語は何ですか?舞台裏:JavaScriptをパワーする言語は何ですか?Apr 28, 2025 am 12:01 AM

JavaScriptはブラウザとnode.js環境で実行され、JavaScriptエンジンに依存してコードを解析および実行します。 1)解析段階で抽象的構文ツリー(AST)を生成します。 2)ASTをコンパイル段階のバイトコードまたはマシンコードに変換します。 3)実行段階でコンパイルされたコードを実行します。

PythonとJavaScriptの未来:傾向と予測PythonとJavaScriptの未来:傾向と予測Apr 27, 2025 am 12:21 AM

PythonとJavaScriptの将来の傾向には、1。Pythonが科学コンピューティングの分野での位置を統合し、AI、2。JavaScriptはWebテクノロジーの開発を促進します。どちらもそれぞれのフィールドでアプリケーションシナリオを拡大し続け、パフォーマンスをより多くのブレークスルーを行います。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

SublimeText3 Linux 新バージョン

SublimeText3 Linux 新バージョン

SublimeText3 Linux 最新バージョン

PhpStorm Mac バージョン

PhpStorm Mac バージョン

最新(2018.2.1)のプロフェッショナル向けPHP統合開発ツール