Unity+Firebaseでソシャゲ版ワンナイト人狼を作ってみた

この記事は[Unity #3 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/unity3)の25日目の記事です。

unityとfirebaseを駆使して初めてゲームを作ってみたのでその知見を共有する記事です。


こんにちは。[virapture株式会社](https://virapture.com)の[もぐめっと](https://mogmet.com)です。

![DSC04588.JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/42234/34c5a75c-8d6b-5a2b-5b38-cc34f52c8d9c.jpeg)

最近富士山登ってきました。（気持ちだけ）
エスカレータでひょいひょい行けたのでいいところでした。

今日は12/30リリース予定（審査ちゃんと通ってくれれば）のワンナイト人狼オンラインというゲームを作ったので、その時の知見やfirebaseを使ってみた感想をツラツラと記述いたします。

## Unity版Firebaseはトラップがまだまだ沢山ある

発展途上中なのか、firebaseのSDKに罠が多かったです。

いくつか書いたのがあるので良かったら私の罠の軌跡を見てみてください。

[unity+firestore(v7.0.1)でChangeTypeを使うとandroidでcrushする](https://qiita.com/mogmet/items/6e22db9a9269c5711365)
リリース前のトラップだったので結構上記には困りましたが、なんとかノラリクラリ回避できました。

[Unity+Firestoreでenum変換とNullableな値の変換をする](https://qiita.com/mogmet/items/26ffcc4e92e31c922030)
そもそもUnityはnullable対応するのがC#8が入る2020.2からになります。なのでfirestore側もまだ対応してないようで、nullableを使おうとすると怒られるのでコンバータを頑張って書いてあげないと使えなかったりします。

[unity 2020.1以降の環境下でfirebase on the android実機を動かす](https://qiita.com/mogmet/items/9df46c62c457bf831d7f)
androidにはなぜか癖がつよいfirebase君です。


その他トラップとしては下記のようなものもあります。

**arrayRemove, unionはunityではサポートされてない！！！！！**
[ドキュメント](https://firebase.google.com/docs/firestore/manage-data/add-data?hl=ja#unity_11)をみるとこんな悲しい文字が。。。

```
// This is not yet supported in the Unity SDK
```

渋々設計を変えざるをえなかったのでみなさんお気をつけください。

**v7.0.1までのSDKにはマルチバイト文字のバグがandroid限定にある!!!**

7.0.0-7.0.1の環境だと、[こちらのissue](https://github.com/firebase/quickstart-unity/issues/900)の通り、unicodeな文字列をandroid環境のfirestoreでparseしようとすると下記のエラーが出て認識してくれないバグがあります。

```
12-16 12:14:10.776 12841 12993 W System.err: java.lang.StringIndexOutOfBoundsException: offset=0 length=8 string.length()=4
12-16 12:14:10.776 12841 12993 W System.err: 	at com.unity3d.player.UnityPlayer.nativeRender(Native Method)
12-16 12:14:10.776 12841 12993 W System.err: 	at com.unity3d.player.UnityPlayer.access$300(Unknown Source:0)
12-16 12:14:10.776 12841 12993 W System.err: 	at com.unity3d.player.UnityPlayer$e$1.handleMessage(Unknown Source:95)
12-16 12:14:10.776 12841 12993 W System.err: 	at android.os.Handler.dispatchMessage(Handler.java:103)
12-16 12:14:10.776 12841 12993 W System.err: 	at android.os.Looper.loop(Looper.java:214)
12-16 12:14:10.776 12841 12993 W System.err: 	at com.unity3d.player.UnityPlayer$e.run(Unknown Source:20)
```

こちらはクリティカルなバグということで早急に7.0.2がリリースされたのでみなさんもすぐに上げましょう。

## 工夫した点

セキュリティールールが煩雑になるのでなるべくupdateを使わず、createだけでできるように工夫しました。
たとえば重要なところは直接書き換えるのではなくcloud functionを通してupdateさせるとかですね。

また、cloud functionが結構肝になるのでなるべくunit testを書きながら実装を進めていきました。

arrayRemove, unionが使えないのは致命的で、そのためにcloud functionを実装した部分もありますが、結果としてセキュリティ的にはあがったかなぁとおもったので良しとしています。

## 使ってみた感想

普通にアプリのときと同じよう基本機能は使えるので、問題なく実装できるかなと思います。

まだ罠があるところはありますが、大分ならされてきたとは思うので選択候補として使うのはありかと思っています。

ちなみにそもそもなんでPhotonじゃなくてFirebaseを選択したかという点ですが下記のような点で選択しました

- unityとfirebaseの知見がないのであれば、もぐめっとが先駆者として溜めていこうと思った
- firebaseならばゲーム以外にも知見を活かせる
- firebase自体への知見がもともとあった
- そもそもfirebase大好き

地雷は踏みまくりましたが、選択してよかったとは思います。

ただ、本当に地雷は多かったので作り終わった！！と思った後のデバッグ作業は結構時間をとられました。。。

2週間くらいはみなさんもテスト・修正期間はとるようにしましょう。

## 総評

firebaseはいいぞお〜。
今後もどんどん機能を拡充していきます！
課金もfirebaseでがんばります。

12/30にリリース予定なのでよかったらみなさんもワンナイト人狼遊んでみてくださいー！
[twitter](https://twitter.com/mogmet)とかにもご連絡貰えれば個別に事前お試しテストもご案内いたしますー！
ぜひフィードバックなどお待ちしてます！

→[リリースされました。](https://online.1nite-jinro.com/link/store)


オフライン版は既にあっていつでも遊ぶことができますのでよかったら年末年始に家族と一緒にどうぞ！
[iOS](https://itunes.apple.com/jp/app/id886948262)
[Android](https://play.google.com/store/apps/details?id=com.mogmet.onenightwerewolf&pcampaignid=MKT-Other-global-all-co-prtnr-py-PartBadge-Mar2515-1)