2024.12.19
システムの穴を運用でカバーしようとしてミス多発… バグが大量発生、決算が合わない状態から業務効率化を実現するまで
React × Unity(全1記事)
リンクをコピー
記事をブックマーク
青山広大氏:ヤフーの青山です。『React × Unity』ということで発表させてもらえればと思います。
言語としては、ReactだったりTypeScriptだったり、Javaだったり、フロント、バックエンド問わず仕事しています。趣味はショッピングと自作キーボードで、ものづくり全般が好きです。休日とかは猫と一緒にアニメ見たりしてゆっくりとしています。
なんでUnityなのか、というところから説明していけたらと思います。Unityって「ゲーム作れるすごいやつだよね」だと思うんです。対応プラットフォームを見ますと、PCだったり、iOSだったり、Androidだったり、WebGLだったり……ん? WebGL?
つまり、Webの世界にゲームの表現力をもってこれるんじゃないかな!? ということで、今回はReact × Unityについて話せたらなと思います。
今日のゴールは、実際にReactとUnityは連携できるぞというのを実感してもらえたらなと思っています。React × Unityの「×(かける)」の部分、どうやるか一番気になりますよね。僕もここが最初気になりました。ということで、みんな大好きnpmで検索すると、「react-unity-webgl exact match」ということで、まさしくこれですね。
「React Unity WebGL provides an easy solution for embedding Unity WebGL builds in your React application……」、うん、これ使えばできそうだなということで。今回はこのライブラリを使ってやっていこうかなと思います。
連携できるって言っても、何を以って連携できるぞと言えるのかというのがあると思うんですけれども、3点あると思っています。
1点目がReactのコンポーネントとしてUnityのビルド結果を表示できる。Reactの画面にゲームの画面が表示できたら連携できるかなというところです。2点目がReactからUnityのメソッドを呼び出せる。3点目は、逆にUnityからReactのメソッドを呼び出せる。
この3点を満たせれば、連携できると言っていいんじゃないかなと思います。まず上から順に、ReactのコンポーネントとしてUnityのビルド結果を表示できるというのを確認していこうと思います。トゥ!
ということで、まずUnityをWebGLでビルドします。Unity側の作業です。UnityのところのビルドセッティングでWebGLを選んであげまして、ビルドボタンを押します。
するとこのようなかたちでビルド結果が出まして、unitywebという拡張子のものであったり、jsonファイルであったり、UnityLoaderというjsファイルが出力されます。Unity側の作業は以上です。あとはこれをReactで取り込んでいこうと思います。ピッ!
これも本当簡単でして、まずReactでcreate-react-appなどをしまして、初期状態のReactの画面を作ります。そこのpublicフォルダに先ほどのビルド結果をそのままボーンともってきちゃってください。以上です。
あとはReact側の作業で、react-unity-webglライブラリを読み込んでもらって。先ほどのビルド結果の2つのjsonファイルとJavaScriptファイルをライブラリに取り込ませてあげます。ライブラリがunityコンポーネントというものを持っているので、そいつをそこに取り込ませてあげます。
今回はわかりやすくするためにReact側ではHeaderコンポーネントを作って、Mix Leapという文字を表示させています。これで完成です。
どうなるか見てみましょう。ポン!ポチッと。ブラウザ上でこのようなかたちでヘッダーの部分に先ほどの文字列と、下のほうにゲーム画面が確認できるかなと思います。これで1点目のReactのコンポーネントとしてUnityのビルド結果は表示できたと言えると思います。
じゃあ2点目いきます。one by oneでジャンジャンいきますね。ReactからUnityのメソッドを呼び出せることを確認していきます。
まずReact側の作業です。React側でUnityのメソッドを呼ぶボタンなどを作りましょう。MoveRightButton([右へ]ボタン)。これをonClickするとUnity側のBallオブジェクトのMoveRightメソッドに対して1という数字を渡します。これが右に1移動するみたいなかたちで実装できたらなと思っています。こいつを先ほどのHeaderのUnityコンポーネントの間に入れる感じで作ります。
ではUnity側のほうを見ていきましょう。Unity側は先ほどのBallオブジェクトにひもづくBallControllerなどを作りまして、そこに呼び出したいMoveRightメソッドを作ります。MoveRightメソッドに1が渡ってきたら、ここのX座標に1が入ってきてプラスされる。なので右にX座標分ずれるという動作ができるかなと思います。これで実際にビルドして、結果を見てもらいましょう。
バーン! ということで。[右へ]を押すと、パーン、パーン、パーンと右へプラス1するのが確認できます。あ、ついでに[左へ]ボタンも作りまして-1を渡しています。すると逆方向にちゃんと動きます。これで2点目、ReactからUnityのメソッドを呼び出せるというのが確認できたのではないかなと思います。
続きまして3点目いきます。逆にUnityからReactのメソッドを呼び出せる。確認していきます。ドーン!
React側の作業としまして、Unity側のChangeYearメソッド、これはイベントハンドラーですね、が呼び出された際に、React側のsetYearというメソッドを呼びます。こちらは先ほど紹介がありましたHooksを使っています。Hooksで2020という値を初期値に持っていて、そいつをHeaderで読み込んで。ここのMix Leapのあとのyearの部分に渡しています。
初期値は2020なので最初は2020と表示されていますが、Unity側でChangeYearメソッドで例えば2021などの数字が渡りますと、ここのsetYearにセットされて、Headerの部分、ここが2021になれば連携できるぞと言えるかなと思います。React側の作業は終わりです。ということで、バーン!
Unity側、この作業だけちょっと面倒くさくて、プラグインを作らなきゃいけないんですけれども。1行目はそういうものだと思ってください。2行目、3行目が大事でして、Unity側のChangeYearメソッドに対してReact側のChangeYearメソッドをひもづけるという、本当シンプルなプラグインを作りました。
あとはこれをUnity側で呼び出します。先ほどのプラグインをDllImportというかたちで取り込みまして、ChangeYearメソッドをここで定義しています。
Unityのゲーム画面に、OnClickUnityButtonがセットされたボタンがあって、押されたとしましょう。そのときに、ChangeYearが2021という数字を渡して実行されます。これだけでUnity側の作業も完了です。
動作見ていきましょう。UnityButton押しますね。ポンッと。今変わったの見えましたかね? ここのヘッダーの部分です。たぶん見逃した方が多いと思うので、もう1回やります。ボタンを押しますと……2020が2021になりましたね。
ということで、3点目。UnityからReactのメソッドを呼び出せる。これも確認できたかと思います。1、2、3全部確認できたので、ReactとUnityは連携できるという実感を持ってもらえたんじゃないかなと思います。
まあ連携できるとは言っても、これ何に使うんだと。みなさんのやる気を引き出そうかなと思いまして、実際に作ってみました! 上の部分がヘッダーでReactで実装しています。下の部分はUnityのゲーム画面です。再生しますね。
食品ストアを作ってみました。ユニティちゃんというモデルがいるんですけれども、その子がビールの棚に近づくと……このようなかたちでReactのモーダルが動きます。実際に表示を確認できるかなと思います。もうこの時間なので、みなさんビールとか飲みたくなっているんじゃないでしょうか。
ビールだけじゃなくソーダとかでもいいですけども。梅酒ソーダ割りうまいですよねという感じで。ちゃんと連携できるということを確認できるかなと思います。
最後、お酒いっぱい飲んだので、水も飲んどきましょう。カートもちゃんと押すと、プラス2というかたちで入ってますね。というのが確認できたかなと思います。
というわけで、完!という感じで。みなさん家に帰って……あ、みなさんもう家ですね。家でちょっとやってみてください!(笑)。以上です。
2024.12.20
日本の約10倍がん患者が殺到し、病院はキャパオーバー ジャパンハートが描く医療の未来と、カンボジアに新病院を作る理由
2024.12.19
12万通りの「資格の組み合わせ」の中で厳選された60の項目 532の資格を持つ林雄次氏の新刊『資格のかけ算』の見所
2024.12.16
32歳で成績最下位から1年でトップ営業になれた理由 売るテクニックよりも大事な「あり方」
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
PR | 2024.12.20
モンスター化したExcelが、ある日突然崩壊 昭和のガス工事会社を生まれ変わらせた、起死回生のノーコード活用術
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.18
「社長以外みんな儲かる給与設計」にした理由 経営者たちが語る、優秀な人材集め・会社を発展させるためのヒント
2024.12.17
面接で「後輩を指導できなさそう」と思われる人の伝え方 歳を重ねるほど重視される経験の「ノウハウ化」
2024.12.13
ファシリテーターは「しゃべらないほうがいい」理由 入山章栄氏が語る、心理的安全性の高い場を作るポイント
2024.12.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
Climbers Startup JAPAN EXPO 2024 - 秋 -
2024.11.20 - 2024.11.21
『主体的なキャリア形成』を考える~資格のかけ算について〜
2024.12.07 - 2024.12.07
Startup CTO of the year 2024
2024.11.19 - 2024.11.19
社員の力を引き出す経営戦略〜ひとり一人が自ら成長する組織づくり〜
2024.11.20 - 2024.11.20
「確率思考」で未来を見通す 事業を成功に導く意思決定 ~エビデンス・ベースド・マーケティング思考の調査分析で事業に有効な予測手法とは~
2024.11.05 - 2024.11.05