概要
ゲームを作っている時に、キャラクターのステータスや移動スピード等の各種パラメータの細かい調整を何度も行うことになると思います。
ステータス等に関してはUnityのエディター上での確認で十分ですが、
アクションゲーム等の場合、やはり実際にiPhoneやAndroidの端末で触ってみないと分からないと思います。
ただ、ここで1つ問題があります。
それは実機ビルドが非常に時間が掛かると言う事。
私の環境だと、Macbook pro 15inch 2014モデルでメモリを32Gに拡張していますが、それでも簡単なカジュアルゲームのbuildに数分掛かる等あり、細かい調整を何度も行うのはかなりしんどいです。
また、Debugger機能として、各種パラメータを弄るUIを作ってしまうと言うのも考えたのですが、元来の面倒くさがりな私にとってそのUIを作る、且つ、パラメータが増える度にUIを弄って行く苦行に耐えきれる自信がないです。
今回はGUIを作らずに、Unityで再ビルドしなくてもパラメータを弄ってリアルタイムに反映させる方法を紹介します。
FirebaseのRemoteConfigを利用する
このブログでこれまでに何度か登場してきたFirebaseを利用します。
Firebaseはリアルタイムデータベースや、Twitter認証等の他に、RemoteConfigと呼ばれる機能が提供されています。
これは、その名の通り、サーバ上に設定を置いて、それをアプリが参照する仕組みです。
主にアプリなどではA/Bテスト等に用いられます。
やっている事は、jsonライクなパラメータをFirebaseに登録するだけなので、今回の要件を叶えることが出来ます。
扱える型
実際にどんなデータを扱えるのかです。
- bool
- IEnumerable
- double
- long
- source
- string
※詳細はこちらから。
floatが欲しい所ですが、doubleで代用できそうなので良しとしましょう。
実際の入稿画面
現在作っているぱたぱたう〜のんの作りかけの設定のキャプチャです。
また、パラメータを追加する時は、以下のような画面から入稿します。
値を入稿したら、「変更を公開」ボタンを押して本番反映しましょう。
Unityでの準備
FirebaseのRemoteConfigを利用するには、RemoteConfig用のパッケージを導入する必要があります。
こちらより、FirebaseSDKをダウンロードし、その中の「FirebaseRemoteConfig.unitypackage」をimportします。
また、Firebaseのコンソールから以下の設定ファイルをダウンロードします。
- iOS
- GoogleService-Info.plist
- Android
- google-services.json
細かいやり方は、以下の記事に詳細を纏めて居ますので、まだFirebaseコンソールの初期設定が終わっていない方は参照ください。
Unity上でRemoteConfigからデータを取得する
以下はRemoteConfigからデータを取ってくるSampleコードです。
再掲しますが、以下のキャプチャのデータを取得してくるコードです。
設計方針
今回作ったのは、レベルデザインを行うことをメインで考えているので、リリース時は利用しないコードで設計を考えます。
RemoteConfigはゲーム起動開始直後にFetchしてきて、後はシングルトン内に展開したフィールド情報を使いまわす想定としています。
また、RemoteConfigは12時間キャッシュが聴くのですが、今回は微調整をリアルタイムで確認したい為、キャッシュは行わないようにします(Debugモードで実行)
使い方
ゲーム起動時のタイミングにでも、以下を埋め込みます。
FirebaseRemoteConfig.Instance().fetch((bool result) => { // データ取得成功時の処理 });
RemoteConfigからデータの取得が完了した際に、resultに成功/失敗のフラグを持たせてコールバックされるようにしているので、適宜処理を埋め込みます。
後は、コード見るとわかりますが、シングルトンなので以下のようにGetterを呼び出せば値を取り出せます。
FirebaseRemoteConfig.Instance().CatOnStageTimeMin;
処理の簡単な説明
キャッシュをOFFにする
FirebaseのRemoteConfigはDebugモードで実行すればキャッシュがかかりません。
その設定の方法は、以下のように行います。
var settings = Firebase.RemoteConfig.FirebaseRemoteConfig.Settings;
settings.IsDeveloperMode = true;
Firebase.RemoteConfig.FirebaseRemoteConfig.Settings = settings;
キャッシュデータをFetchして利用
コード上だと、以下の部分でローカルにキャッシュが完了しています。
System.Threading.Tasks.Task fetchTask = Firebase.RemoteConfig.FirebaseRemoteConfig.FetchAsync (new System.TimeSpan (0)); fetchTask.ContinueWith(task => { });
が、実際にUnityで使おうとすると、キャッシュデータをFetchする必要があります。
それを行っているのが、以下のコードです。
Firebase.RemoteConfig.FirebaseRemoteConfig.ActivateFetched ();
RemoteConfigのFetchデータから値を取り出す。
データを取り出すのは、以下の様にGetValueを使います。
Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue("version")
GetValueで返却されるデータは、「ConfigValue」で返ってきます。
ConfigValueは、値を様々な型に変換するプロパティが用意されています。
上記のversionは、string型で登録されているので、ConfigValueでStringValueプロパティを指定して取得します。
Firebase.RemoteConfig.FirebaseRemoteConfig.GetValue("version").StringValue;
ログの部分
Utilitys.LogCurrentMethod("Faild.");
この部分ですが、クラス名・メソッド名と一緒にログ出力を行う拡張機能です。
詳細は、過去に記載してますので、以下を参照ください。
それ以外のやりかた
他に思いつくやり方ですが、思いつくところだと以下でしょうか。
UnityRemoteを使う
Unityが提供しているiPhone, Androidのアプリで、一番手っ取り早く実機確認できるのがこれです。
ですが、この欠点が遅延が発生しまくると言う所が厳しく、アクションゲームの細かい調整には適していないかと思います。
l2 Localizationを使う
ローカライズがメインのAssetですが、l2 Localizationを使うと言うのも選択肢として考えて良いかもしれません。
こちらは、Googleスプレッドシートでの変更が端末であってもリアルタイムに反映されるみたいです…が、有料アセットと言うところもあり私は試せていません。
さいごに
今回はFirebaseのRemoteConfigを利用してレベルデザインを行う方法について記載しました。
最初の下準備さえ行えば、後はプロパティを追加していくだけで、再度ビルドしなくても端末とFirebaseだけで設定をリアルタイムにやり取りが出来るので、非常に開発が楽になるかと思います。
(こういう面倒な事を簡単にする仕組みばかりに手を出して、肝心のゲーム開発が遅延しているのはここだけの話…。