連載「Technology Company Internals」では、テックカンパニーの内側で働くエンジニアに、技術に精通したエキスパートが対面で話を聞き、テックカンパニーとは何か?を探るだけでなく、テックカンパニーを目指す企業の指針となることを目指します。
国産メタバースアプリ「REALITY」とは?
– 自己紹介をお願いします。
清: 清 貴幸です。REALITY株式会社のネイティブアプリチームでエンジニアチームのマネージャーを務めています。
あおやま: あおやまです。新卒3年目で、iOSのエンジニアを務めています。
– 今回はアバターでZoomにご参加いただいていますが、REALITYというサービスについて教えてください。
清: REALITYを一言でいうと3Dのアバターによるバーチャルライブ配信アプリです。
ライブ配信サービスなので、贈り物やコメントを送り合ったり、ゲストを呼んだコラボ配信など、ユーザー同士のコミュニケーションが中心のサービスです。
一方、アバターの着替えを楽しめたり、アバター同士で一緒にゲームを遊んだりと、一般的なライブ配信サービスともまた違った機能があるのが面白いところです。こうした可能性を突き詰めた先にメタバースの世界観を見据えていて、開発やグローバル展開を進めています。
– 現在メタバースといえば、VRのイメージが強いです。
清: メタバースという言葉の定義はまだ固まっていないので、社内でもよく議論していますし、それが定義されるプロセスに私達も関わりたいですね。「俺たちが作るものがメタバースだ!」みたいな。
「何がメタバースか」という問いについては、今は個人によっても答えが違うんじゃないかなと思います。あおやまくんはどう考えてる?
あおやま: メタバースの定義はいろいろあると思うのですが、一つ間違いないと思っているのは、アバターを使ったコミュニケーションの比重が大きいということです。
そしてVRゴーグルをかぶると、アバターへの自己投射性が上がるので、VRを見据えておくのも必須かなと。VRゴーグルの普及度合いをにらみながら、戦略を練っていくんだと思います。弊社にもGREE VR Studio Laboratoryという部署があり、VRについては研究を進めています。
あと、「3D空間を自由に動き回れる」という意味では、REALITYにも「ワールド」という機能があります。サービス開始3周年に合わせて2021年8月にリリースしました。
清: あと、「どこからメタバースに向かっていくのか?」も重要な視点だと思います。
ゲームから、というアプローチもあれば、今流行りのNFTから、というアプローチもある。
自分たちはライブ配信という、いわばSNSから向かっていこうとしているんです。
そういう視点からすると、他のSNSに比べて、REALITYはすべてのユーザーがアバターを持っているのが強みと言えるかもしれません。
– なるほど、それは面白い視点です。
清: あと個人的な感想としては、「REALITYのアバターが一番かわいい」とは思っています(笑)
「実はネイティブの開発領域が多い」
– REALITYはどういうふうに作られているのでしょうか
清: REALITYは3D要素が強いので、全部Unityで作られていると思われることも多いんですが、実はネイティブの開発領域が多いんです。これは結構驚かれる点ですね。
例えば、アプリを立ち上げて最初に表示される配信一覧画面はネイティブで書かれています。ライブの配信画面についてはUnity、ライブの視聴画面はUnityとネイティブの組み合わせ…など、ネイティブの比重が大きいのがREALITYの特徴です。
– どうしてそのような技術構成になっているのでしょうか?
清: 開発初期にすべてUnityで作ってみたところ、ユーザー体験に不満を感じたんです。ユーザー同士のコミュニケーションが重要なサービスなので、UXも最高のものを提供しなくてはなりません。そうなると、ネイティブで開発するしかありませんでした。
– UnityとiOSネイティブという、全く違う環境をどうやって統合しているのでしょうか?
あおやま: 「Unity as a Library」と言って、Unityをライブラリとして使うというアプローチを取っています。
– 「Unity as a Library」はiOS開発の界隈では、よく使われているんでしょうか?
あおやま: 利用者はまだそれほど多くないと思います。ライブラリとしての利用をUnity社が公式にサポートしたのは2019年(Unity 2019.3)で、まだそれほど歴史も長くありませんし、実は私達は公式サポートよりも前から独自に開発していたんです。
– すごいですね、Unity as a Libraryを独自に構築したということですか。
清: はい。当時、Unityをライブラリとして扱えるようなアプローチを実現しているライブラリがないかと調べたところ、一件だけオープンソースのライブラリがあったんです。そのコードを解析して、iOS側からUnityのView Contrrollerにアクセスできる方法を見つけました。
先程あおやまが話したUnity公式の枠組みに移行する予定はあります。自前でかなり最適化しているので大変ですが。
– どのような最適化ですか?
清: 例えば現在、Unityのコードは、iOS側から見ると一つのフレームワークになっています。当初はこうじゃなかったのですが、その当時はUnityのコードを少し修正するだけで数千ファイルに変更が加わってしまい、そのたびにビルドに数十分かかるという状況でした。
それをフレームワーク化することでビルド時間が劇的に短縮されただけでなく、リリースフローやCI / CDワークフローの最適化にも繋がりました。
– 違う言語で作られたものを統合するのに困難はありませんか?
清: 開発そのものは、Unityとネイティブでチームが分かれているので、そこまでオーバーヘッドはありません。ただ、Unityのライブラリにネイティブ側が依存する形になるので、チーム間でのリリースタイミングの調整は大変ですね。「ある機能がUnityに入っていると思ったら、本番ビルドで入ってなかった」みたいな事故がまれに起きます。
あおやま: 3D部分はUnity、それ以外はネイティブにきれいに分かれるのが理想なんですが、うまく分けられずに、責任があいまいになっている部分がありますね。例えばクローゼット画面と言って、アバターの着替えを行える画面があるのですが、ネイティブで作りたいけど全体的にUnityになっていたりします。
他にはUnityとネイティブの間で状態管理が二重に行われている部分があったり、Unity側で発生したエラーを適切にハンドリングするのはいつも悩ましいです。
async / awaitも、DIも - 最先端レベルのiOS開発環境
– お話をお聞きしていると、iOS開発の最先端を走っているような印象です。
清: そうですね、Unity as a Libraryだけじゃなくて、全体的にモダンな開発環境だとは思います。
REALITYは新しいもの好きなユーザーが多いので、OSやデバイスの移行も早くて、開発のターゲットも最新環境を基準にできるんです。だから、iOSの新しいAPIや、Swiftの新しい言語機能とかも積極的に使っていけます。先日Xcodeが13.2にアップデートされましたが、async / awaitなども広く使えるようになったので、バリバリ活用していきたいですね。
あおやま: アーキテクチャ自体も、どんどん新しくしていますね。RxSwiftやRxCocoaでリアクティブプログラミングも行っていますし、Swift UIやCombineも本格的に活用しています。
また、iOS開発ではまだそれほど広くは使われていないと思いますが、DI(Dependency Injection)をベースとしたアーキテクチャも導入しています。
– DIに途中から移行するのは大変そうです。
はい。Uberが開発しているneedleというDIコンテナをベースにして、1年くらい前から書き換えを行いました。Constructor Injectionを徹底していて、ほぼ全体的に書き換えは完了しています。
DIのおかげで、モジュール分割が非常にはかどりました。特定の機能が特定のモジュールに閉じるようになったことで、コードベースの安定性が全体的に増しただけでなく、特定のモジュール内で新しいチャレンジを行うこともできるようになりました。Swift UIも、まずは「ポイント交換」という一部機能の実装に使ってみて、その後本格導入したという流れです。
– iOS開発者にとって理想的な環境ですね。本日は興味深い話をありがとうございました。最後に、読者に向けてメッセージをお願いします。
清: メタバースを開発することに興味はあっても、「自身のスキルセットとは遠いかな…」とか感じてらっしゃるネイティブアプリの開発者の方がいたら、ぜひうちに来ていただきたいですね。今回のインタビューだとiOS開発が中心でしたが、Android開発者も求めています。
ネイティブアプリの開発スキルを活かしてメタバース開発を行える、唯一無二の職場だと思いますので。
あおやま: 技術が心から好きな人と一緒に働きたいですね。社内の勉強会とかもたくさん開催されていて、プロダクトに関係ある技術はもちろんですが、プロダクトと直接関係ない技術についても、普段からよく情報共有しています。
学べる環境はすごく整っていると思いますので、技術的な話で一緒に盛り上がりたいです。
REALITY株式会社は、メタバースの実現に向け、共に挑戦していく仲間を募集しています!