小林氏の自己紹介

小林慶祐氏:それでは、さっそくですがライトニングトークを始めたいと思います。表題のとおり、「UnityとGoogleCloudFunctionを連携して社内サービスを作った話」ということで、小林から発表します。よろしくお願いします。

まず初めに登壇者情報ということで、軽く自己紹介をさせてください。現在、Graffity株式会社でUnityエンジニアとして活動している、小林と申します。専門領域は一応サウンドプログラミングで、Twitter(現X)では@8bitdots、QiitaはCova8bitdotというアカウントでいろいろ発信をしてます。

最近だと、このフェスを機会に、Unity関連のデザインパターンや細かい内容の記事をなるべく二番煎じにならないように心掛けて、平日毎日投稿しています。過去にいろいろなUnityのコミュニティで登壇したりとか、あとは技術書の査読などを行っています。

急遽宣伝になって恐縮ですが、私が共著で参加している『Unityバイブル R5夏号』に先ほど「Amazon」のページができました。いわゆる初中級者のゲーム開発者向けの本になります。サウンドの章を丸々1章担当しているので、Unityに興味があったり、近くにUnityの初中級者の方がいたら、ぜひぜひ予約ボタンをポチッてもらえればと思います。

まだ今はページができたばかりで、たぶん明日か明後日ぐらい(登壇時点)から予約ができるようになるかと思うので、ぜひよろしくお願いします。

また、今所属している会社のGraffityは、現在はtoC向けのAR事業と、あとはtoB向けのARエンタメDX事業というところにフォーカスしている、ARに特化したスタートアップ企業になります。

まだ社員も15人に満たないぐらい、本当に小規模ですが、ARのシューティングゲームなどをリリースしていたりします。ARに興味がある方がいたら検索してもらえればと思います。

ということで、宣伝と自己紹介はこのぐらいにして、さっそく本題に移ります。

Unityとは

まずは基礎知識の部分からおさらいしたいと思います。「Unityとは?」というところです。Unityとは、Unity Technologiesが提供しているゲームエンジンです。

基本的に言語はC#で書かれていることが多いです。PC、iOS、Android、WebGL、あとはコンシューマー、例えばSwitchだったりPS4だったりXboxだったりにアプリをビルドできる、マルチプラットフォームに展開できる特徴を持っています。

国内のスマホゲームはだいたいUnity製で、あとはプラグインを導入することでARやVRのアプリも作ることが可能になっています。

GCF(Google Cloud Functions)とは

次、「Google Cloud Functions」について。おそらく今回の参加者はWebエンジニアの方が多いのかなと思って。そうなると本当に釈迦に説法で恐縮ですが、簡単に説明したいと思います。

GCFとはいわゆるGCP(Google Cloud Platform)上で提供されているFaaS(Function-as-a-Service)と呼ばれているものになります。

いわゆるサーバーレスと呼ばれているもので、クラウド上で任意のコードを実行する環境を提供してくれるようなものです。JavaScriptだったりPythonだったり、いろんな言語に対応しているものになります。

こちらを聞くと「ぜんぜんニッチじゃないじゃん!?」と思う方が多いかなと思います。正直、登壇する前は自分もそんな感じで思っていたんですが、ここでQiitaの検索結果を見てみましょう。

Qiitaで「Unity CloudFunction GCP」で検索すると、書いた当時は8件程度記事が出てきました。関連度順でいうと、上位3つはすべて自分の記事になっております。

一応「CloudFunction」というキーワードだと、UnityのほかのSDK(Software Development Kit)で使われている用語だったりするので若干Unityの記事があるんですが、いわゆるGCFに関する記事でいうと、ほとんどヒットしないかたちです。

もうちょっとワードを絞ってみようと思って「Unity GoogleCloudFunction」で検索すると、なんと自分の記事しかない。

「おや?」と。UnityもGCFもぜんぜんニッチじゃない技術だけれど、実は組み合わせるとニッチであることがQiitaの結果からだと言えるかなと思ったので今回登壇しました。

UnityとGCFとGCsqlで社内のデバッグ端末の管理サービスを構築

今回の主な部分です。UnityとGCFとGCsql(Google Cloud SQL)で、社内のデバッグ端末の管理サービスを構築しました。Unityで作ったアプリなので、入力インターフェイスとしてはAndroidでもiOSでも動かせるものです。

それぞれにNFCタグを各デバッグ端末にあらかじめ設定しておいて、その端末のNFCデータと社員証を読み込むことによって、誰が何の端末を借りるのかという情報をGCFに投げるというかたちです。

GCF側はPythonで実装していて、Pythonで受け取った情報をパースして、Cloud SQLにあるデータベースに問い合わせて、ちゃんと借りられるかどうか、返却するかの処理を行っています。

(スライドを示して)貸し出し・返却フローは、図でいうと真ん中から下半分というかたちです。利用者には非エンジニアの方も多いので、一応そういう方がレンタル状況を確認するためにも、テーブルのアップデートと同時にスプレッドシートの更新も行うようにしています。

また、返却期限は一応設けているんですが、たまに返却期限を過ぎていたり、あとはリモートワークもあるので、場合によっては端末を持ち帰って開発するケースもあります。

その場合だと、実は借りっぱなしでしばらく放置しているようなものもあったり、紛失してしまったなどのトラブルもあったりします。

そういう紛失の防止というところで、もし返却期限を過ぎていたら、レンタルした人に対してちゃんと通知を飛ばすようなボットも作成しています。それが画面の上半分の青いエリアですね。

cron的に用いているのがCloud Schedulerで、そこからCloud Functionsを叩いて、テーブルに問い合わせをして、必要であればSlackで通知するかたちで作っています。

実際に作ったものの写真になります。左側に社員証のFeliCaを用意しておいて、端末に対してNFCタグのシールを張って、それをレンタルのアプリで読み取ってあげるというかたちです。

社員証を読み取ったので、「こんにちは. covaさん」みたいなかたちで自分の名前が出ています。この後、NFCタグを読むとデバイス情報が出て、あとは借りるボタンを押すと、そこからエンドポイントを叩くようなかたちになっています。

また、右側は先ほどの返却通知ボットが実際に動いている例です。メンションの部分は個人情報になるのでぼかしていますが、こんな感じで誰がなんの端末を借りて、返却期限を過ぎているとメンションが定期的に飛んでくるシステムを作って、紛失の防止を減らしています。

構築する際の落とし穴

ここまで聞くと、「普通に実装すればできるんじゃないか?」と思うかもしれませんが、実はけっこう落とし穴がありました。

そのうちの1つが、UnityからGCFのエンドポイントを叩く部分でした。cURLで叩く時は普通にJSONのデータをPOSTして通っていたのですが、同じJSONのデータをUnityに食わせてエンドポイントを叩くと、なんと400のエラーが出て弾かれる。Bad Requestとなってしまった。

これを解決するためにいろいろ検索したのですが、たまたま海外の「Stack Overflow」で1件だけ同じ記事が見つかったので、そちらを参考にしました。

解決方法としては、UnityのcURLのラッパー的なものでUnityWebRequestというクラスがあるので、それを叩いてエンドポイントを呼び出すのですが、その時に、ちゃんとヘッダーを書いたりダウンロードとかアップロードのハンドラーを書くことが大事です。

(スライドを示して)その中でも3つ目が一番大事で、POSTするJSONデータをバイナリに1回エンコードしてあげないとなぜか通らないことがありました。なぜかJSONのそのままのStringの文字列データはNGだけど、バイナリに変換するとGCF側が受け付けてくれるようなことがありました。ここでけっこう沼ってしまって、せっかくなのでそのことを記事として公開してあります。

既知の技術同士の組み合わせはブルーオーシャンな場合がある

まとめです。一般的にスマホゲームでは、UnityからAPIサーバーのエンドポイントを叩く時は、GCEとかEC2のインスタンスを用意することが多いです。ただ、社内サービスとか小規模であれば、サーバーレスのGCFやLambdaなどで代替は可能かなと考えています。

また、先ほどのQiitaの記事の例もありますが、意外と既知の技術同士の組み合わせをやっていない場合があるので、ある意味組み合わせ次第ではブルーオーシャンになっているのかなと思います。

またQiitaは個人的に、「いつか誰かの役に立つだろう」というような知見の共有に最適なプラットフォームだと考えています。「バズらなくても誰か1人でも役に立てば良いかな」というスタンスで記事を書いているので、ぜひそういう記事が増えてくれるとすごくうれしいなと個人的に思っています。

最後に、みなさんもいろいろな技術を組み合わせて便利なサービスを作っていきましょう、ということを締めの言葉にして、LTを終わりにしたいと思います。ご清聴ありがとうございました。