2024.12.10
“放置系”なのにサイバー攻撃を監視・検知、「統合ログ管理ツール」とは 最先端のログ管理体制を実現する方法
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.10
メールのラリー回数でわかる「評価されない人」の特徴 職場での評価を下げる行動5選
2024.12.09
10点満点中7点の部下に言うべきこと 部下を育成できない上司の特徴トップ5
2024.12.09
国内の有名ホテルでは、マグロ丼がなんと1杯「24,000円」 「良いものをより安く」を追いすぎた日本にとって値上げが重要な理由
2023.03.21
民間宇宙開発で高まる「飛行機とロケットの衝突」の危機...どうやって回避する?
2024.12.10
職場であえて「不機嫌」を出したほうがいいタイプ NOと言えない人のための人間関係をラクにするヒント
2024.12.12
会議で発言しやすくなる「心理的安全性」を高めるには ファシリテーションがうまい人の3つの条件
2024.12.06
嫌いな相手の行動が気になって仕方ない… 臨床心理士が教える、人間関係のストレスを軽くする知恵
PR | 2024.11.26
なぜ電話営業はなくならない?その要因は「属人化」 通話内容をデータ化するZoomのクラウドサービス活用術
2024.12.11
大企業への転職前に感じた、「なんか違うかも」の違和感の正体 「親が喜ぶ」「モテそう」ではない、自分の判断基準を持つカギ
PR | 2024.11.22
「闇雲なAI導入」から脱却せよ Zoom・パーソル・THE GUILD幹部が語る、従業員と顧客体験を高めるAI戦略の要諦