Help us understand the problem. What is going on with this article?

clusterのAndroidアプリ開発状況の紹介

はじめに

この記事はクラスター Advent Calendar 2020の20日目の記事です。
昨日は @MSA_i さんの『非ゲーム分野でUnity Animatorの想定外の挙動を避けるために』でした。

個人でUnityを使ってゲーム開発(エターナル)してるんですが、未だにAnimatorは使いこなせてないので勉強になります :smile:

自己紹介

クラスター株式会社で、clusterのバックエンドServer(Go)とAndroidの開発を担当をしています。
今回は、clusterのアプリのワールド・イベントに入るまでの部分(以後、outroomと略します)のAndroidネイティブ化を短期間でガッと作ってリリースしたので、現状を確認して紹介しようと思います。

Unity版のアプリをAndroidで再実装することなった経緯など

@mizoguche の記事で紹介されているので併せて読んでいただければと思います。
https://qiita.com/mizoguche/items/09719bb1ea3c3265dcdc

以下なども一応検討したのですが、不採用になった最終的な決め手は、すでにUnityとのBridgeが発生するのでこれ以上Bridgeが増えるのは厳しそう という理由が一番大きいと思います。
(もっと組織が大きくなってメンバーが増えたりしたらまた判断が変わるかもしれませんが)

直接的な決め手ではないですが、自分を含めAndroid/iOSを書きたいと思ってた :raised_hand: という人が多かったというのもあると思います。

メンバー構成

各領域に大体2人はいる感じです(大体、兼務ですが)
レビューできる体制になっていることが大事

image.png
※図がでかくなりすぎたので、ServerとWebフロントエンドの部分は省略しました

自分は元々趣味でAndroid書いてたり以前働いていた会社で多少書いていたりしたので、最新をキャッチアップしつつUnityとのBridge部分を気合で頑張るという感じでした。

ちなみに、Androidメンバーでタッグを組んでる @warabi_mochi はWebフロントエンドエンジニアから今回Android入門してめちゃくちゃ活躍して助かってます :tada:
(詳しくは、 https://qiita.com/warabi_mochi/items/e78aae6af59f396d5dde をご覧ください)

Unity as a Library やBridgeなどを絡めたざっくり全体構成

clusterのアプリ内では、inroomとoutroom用に2つのプロセスが動くような形になっていて、現状は基本的にoutroomからinroomを起動するだけという関係なのでかなりシンプルな構成で動いています。
(Billingの呼び出しなどもありますがoutroomのプロセス内で完結してます)

image.png

今後もし、inroomのprocessからoutroomのprocessにしか無い情報などアクセスする必要が出てきたら今の構成のままでは厳しいのでプロセス間通信などを実装することになりそうです :innocent:

module構成

流行りはもっと分割するっぽい?ですが、チームメンバーも少ないので必要最小限のシンプルな構成を意識しました。
api/app/unityLibraryの3つのmoduleのみです。
image.png

  • api: clusterのserverがgoa製でswaggerファイルがあるのでOpenAPITools/openapi-generatorでKotlinのコードをジェネレートしている
  • app: ui/viewModelなどなどapi呼び出し以外のoutroomのコードがここに全部入っている
  • unityLibrary: UnityからExportしたモジュールで、inroomの部分

Android部分の技術選定など

基本的には https://developer.android.com/modern-android-development?hl=ja にあるモダンな構成になるようにしました。

  • Kotlin
  • Lifecycle
  • ViewModel
  • Room
  • Navigation
  • databinding
  • viewbinding
  • 配布はAndroid App Bundle
  • etc...

上記以外だと、clusterは認証にFirebase Authenticationを使っているのでFirebase系のライブラリを使っていたりします。

DIに関しては、開発初期は普通にDaggerを使っていましたが、Hilt と Jetpack の統合でViewModel周りのDIをうまいことやれそうなことがわかって途中でHiltに移行しました。

あとは、わざわざ古いバージョン使うのもアレなのでGoogle Play Billing Libraryは、version 3を使うようにしました。
コンビニ決済(PendingPurchase)対応がなかなか厄介でしたね。。。

Test/CI

現状は、はじめの一歩的な感じで1ミリくらいUnitTestがあります。(今度増やしていく予定です :muscle:

リリースまでの間はFirebase Test LabのRoboテストを使って雑にクラッシュしないかなどをテストしてました。
outroomでユーザーの新規登録してinroomの入室まで自動でやってくれて感動しました :smile:

おわり

今いるメンバーでできる限りのことをやったという感じで、まだまだ改善の余地は山程あります。
引き続き開発を加速させていって、良い体験を届けていきたいとおもってます :muscle::muscle::muscle:

明日は @xyx の「ソフトウェアと言霊」です!!!

kyokomi
VRでGo書いてます。最近はUnityも少々。 脱、エターナルしたい。
http://kyokomi.hatenablog.com/
cluster-inc
誰もがバーチャル上で音楽ライブ、カンファレンスなどのイベントに参加したり、友達と常設ワールドやゲームで遊ぶことのできる「バーチャルSNS」を展開しています。スマホやPC、VRといった好きなデバイスから数万人が同時に接続することができ、バーチャルで"集まる"体験を再定義し、全く新しいエンタメと熱狂体験を提供し続けています。
https://cluster.mu
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away