はじめに
この記事はクラスター Advent Calendar 2020の20日目の記事です。
昨日は @MSA_i さんの『非ゲーム分野でUnity Animatorの想定外の挙動を避けるために』でした。
個人でUnityを使ってゲーム開発(エターナル)してるんですが、未だにAnimatorは使いこなせてないので勉強になります
自己紹介
クラスター株式会社で、clusterのバックエンドServer(Go)とAndroidの開発を担当をしています。
今回は、clusterのアプリのワールド・イベントに入るまでの部分(以後、outroomと略します)のAndroidネイティブ化を短期間でガッと作ってリリースしたので、現状を確認して紹介しようと思います。
Unity版のアプリをAndroidで再実装することなった経緯など
@mizoguche の記事で紹介されているので併せて読んでいただければと思います。
https://qiita.com/mizoguche/items/09719bb1ea3c3265dcdc
以下なども一応検討したのですが、不採用になった最終的な決め手は、すでにUnityとのBridgeが発生するのでこれ以上Bridgeが増えるのは厳しそう という理由が一番大きいと思います。
(もっと組織が大きくなってメンバーが増えたりしたらまた判断が変わるかもしれませんが)
直接的な決め手ではないですが、自分を含めAndroid/iOSを書きたいと思ってた という人が多かったというのもあると思います。
メンバー構成
各領域に大体2人はいる感じです(大体、兼務ですが)
レビューできる体制になっていることが大事
自分は元々趣味でAndroid書いてたり以前働いていた会社で多少書いていたりしたので、最新をキャッチアップしつつUnityとのBridge部分を気合で頑張るという感じでした。
ちなみに、Androidメンバーでタッグを組んでる @warabi_mochi はWebフロントエンドエンジニアから今回Android入門してめちゃくちゃ活躍して助かってます
(詳しくは、 https://qiita.com/warabi_mochi/items/e78aae6af59f396d5dde をご覧ください)
Unity as a Library やBridgeなどを絡めたざっくり全体構成
clusterのアプリ内では、inroomとoutroom用に2つのプロセスが動くような形になっていて、現状は基本的にoutroomからinroomを起動するだけという関係なのでかなりシンプルな構成で動いています。
(Billingの呼び出しなどもありますがoutroomのプロセス内で完結してます)
今後もし、inroomのprocessからoutroomのprocessにしか無い情報などアクセスする必要が出てきたら今の構成のままでは厳しいのでプロセス間通信などを実装することになりそうです
module構成
流行りはもっと分割するっぽい?ですが、チームメンバーも少ないので必要最小限のシンプルな構成を意識しました。
api/app/unityLibraryの3つのmoduleのみです。
-
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があります。(今度増やしていく予定です )
リリースまでの間はFirebase Test LabのRoboテストを使って雑にクラッシュしないかなどをテストしてました。
outroomでユーザーの新規登録してinroomの入室まで自動でやってくれて感動しました
おわり
今いるメンバーでできる限りのことをやったという感じで、まだまだ改善の余地は山程あります。
引き続き開発を加速させていって、良い体験を届けていきたいとおもってます