この記事は クラスター Advent Calendar 2021 14日目の記事です。
昨日は、yoshioka_ko57 さんの、「デザインデータの読み解き」 でした。普段やり取りさせてもらっているデザインデータですが、データの節々から様々な工夫や配慮を感じながら日々作業させてもらっています。圧倒的感謝
こんにちは。クラスター株式会社でソフトウェアエンジニアをしている橋本です。今年も残すところ半月ほどとなりましたが、みなさまいかがお過ごしでしょうか。私は、この残り半月という事実を到底受け入れられそうにありません...
さて、モバイル版clusterのアプリのoutroomがネイティブ化されてから1年と少し経ちました。この1年の間にどのようなiOSの開発が行われてきたかをお話していきたいと思います。
組織の話
clusterアプリはWindows(+VR)、Mac、iOS、Androidそして最近リリースされたQuest2と様々なプラットフォームをサポートしていますが、クラスター株式会社でプラットフォームを開発しているのは現在24人ほどです。その中でiOSエンジニアは3人で、それぞれがUnityなど他の領域と兼務しつつ日々機能開発を行っています。
iOSの開発でこの1年で特に大きく変わったことは、iOSエンジニアのが1人増えたことです!!めでたい!!いつもお世話になってます
バーチャルSNSを運営しているクラスター社に入社しました!
— izumi (@rizumi_jp) March 2, 2021
バーチャル世界の発展に向けてやっていきます!https://t.co/U2ZKXNE62g
iOS開発のアーキテクチャの話
さっそくですが、clusterのネイティブ開発がどのように行われているのかをざっくりですが紹介していきたいと思います。まずはこちらの概要図を御覧ください。
clusterはワールドやイベント入室前のoutroom
と入室後のinroom
1という大きく2つ領域に分かれていて、それぞれが(ほぼ)独立して開発されています。この独立性はUnityのUaaLという機能を使うことで実現しています。その中でも今回はoutroom
側(iOS開発)の話をメインにしていこうと思います。※上の図はinterfaceへの依存などは省略しているのであしからず。
まず、clusterのiOS開発ではMVVMをGUIアーキテクチャとして採用しています。このアーキテクチャの採用理由としては、(今では)ネイティブアプリ開発でメジャーなアーキテクチャであることや、Android側と同じようなアーキテクチャをとることで、iOSとAndroidお互いのコードベースを参照しやすくするからと言った点があります。また、画面遷移はCoordinatorパターンを採用していて、Deeplinkや通知機能など様々な起動経路からの画面遷移に強い作りになっています。
その他の採用技術としては、データバインディングにRxSwift、オブジェクトの永続化にCoreData、ApiClientの生成にopenapi-generatorが使われています。まだ一部分ではありますが、CollectionViewのCellにSwiftUIを使ったりと、技術的なチャレンジもこの1年の間に行っています。また、outroom
やinroom
のやりとりを担うBridge
部分ではProtocol Buffersを使用しているのはユニークな点かなと思います。以上でざっくりとしたアーキテクチャや採用技術の説明は終わりになりますが、続いて具体的な機能開発の事例の紹介に移りたいと思います。
機能開発の話
clusterではこの1年で様々な機能がリリースされてきました。特にoutroom
開発ではメッセージ機能をはじめとした、ソーシャル機能やinroom
との連携を生かした、PictureInPicture風の機能2や、それを用いたポータル設置機能や新規サーバー作成機能などをリリースしてきました。他にも、ナビゲーションメニューなどの基本的な機能郡をはじめ、ClusterRoundの対応など様々な改善が行われています。ここでは、PictureInPicture風の機能開発を中心に詳しく話していこうと思います。
この機能を使うと、cluster内のワールドやイベントに参加しながら、次にいきたいワールドやイベントを探したり、探したワールドにみんなで行くためのポータルを今いるワールド内に設置したりすることができるようになります。具体的にどのような実装になっているかというと、inroom
側から「PictureInPictureを開始して」というメッセージを前述のBridge
を経由してoutroom
側で受け取ると、outroom
側でUnityが描画している画面をもっているUIWindow
を任意の形に変形させることで、PictureInPicture風の画面を実現しています。また、PictureInPicture風の画面をスワイプして移動させたりするのもoutroom
側の実装が担っています。
このように例に上げた実装はとてもシンプルですが、基本的にoutroom
側の実装はSwift
で書かれていて、3DCGやUnityの知識があまりなくても、スマホからも参加できるメタバース
のユニークな機能を開発することができるということがわかるかと思います。メタバースはあまり関係ないなと思われていた世のiOSエンジニアのみなさんに、「clusterにはメタバースの世界を加速させるような活躍をする場所がたくさんあるよ」ということを知ってもらえたら幸いです。
さいごに
clusterでのiOS開発の雰囲気が少しでも伝わったでしょうか?体力の都合上かなりざっくりとしたことしか書けませんでしたが、もし興味があるよ!って方がいましたら採用ページを見てもらえればと思います。
次回の クラスター Advent Calendar 2021はalertさんの「ワールド紹介動画の撮影について」です。クラスター社にはバーチャルプロカメラマンが何人かいますが、どんな内容になるか楽しみですね...!