この記事でのバージョン
Unity 2018.4.6f1
はじめに
Unityはエディタだけでなく、Unity AdsやUnity Analyticsなどの
便利なサービスをUnity Servicesという形で提供しています。
Unity は、ゲーム開発はもとより、オーディエンスをひきつけ、維持し、収益につなげるさまざまな無料サービスを提供しています。
そんなUnity Servicesの中(のUnity Analyticsの中)にRemote Settingsというサービスがある事を
以下の動画で知ったので、試してみて、導入や使い方をまとめてみました!
イメージとしては以下のような感じで、
ブラウザ上で設定したデータを、プログラムで簡単に取得出来るといったもの。
もちろん、サーバーサイドの準備や実装は必要ありませんし、
無料で使う事が出来ます!(これ以上使ったら有料みたいなのもなし)
残念ながらゲーム側からデータを送る事は出来ませんが、それでも
ゲームバランスに関わる値の調整、ゲーム内イベントのデータやフラグ管理、広告の配信比率
など、様々な用途に使えるので、覚えておいて損はないと思います。
導入(ブラウザ編)
それでは早速、Remote Settingsの導入方法の解説です。
まず、Unityエディタの右上にある雲のボタンを押します。
すると、Unity Servicesのウィンドウが開かれるので、organizationを選択し、
Createボタン押して、Unity Services上にProject IDを作成します。
なお、Remote SettingsはAnalytics内の機能なのでAnalyticsをONにします。
次にGo to Dashboardからダッシュボードをブラウザで開き、
Analyticsの欄をクリックし、
Remote Settingsを選ぶと、値の追加や確認をするページを開きます。
値を追加する時はADD NEW KEY-VALUEの所を押します。
ちなみに設定できる型はfloat, int, long, bool, stringです。
値の追加や変更をしたらSync押してデータを同期(保存)させるのも忘れずに。
なお、データはRELEASEとDEVELOPMENTに分けて設定が出来ますが、
エディタ上やDevelopment Buildが有効な時はDEVELOPMENTのデータを使い、
それ以外の場合の時はRELEASEのデータを使う、
という感じで自動で読み込み先が変わるようになっています。
導入(Unity エディタ編)
ブラウザ上の設定は以上ですが、エディタ上でもちょっと設定が必要です。
まず、Remote Settingsのアセットをインストールします。
Unity Analytics Remote Settings - Asset Store |
インストールするといきなりエラーが出るので、(おそらくUnity2018.1以降)
RemoteSettingsLinker.csを以下のようにコメントアウトします。
エラーが出なくなったらWindow/Unity Analytics/Remote Settings
からRemote Settings用のウィンドウを開きます。
ウィンドウを開いたらLook up the keyの所を押してブラウザを開き、
Project Secret Keyの所をコピーし、先程のウィンドウにペースト後、Nextボタンを押します。
これで先程ブラウザ上で設定した値を、ウィンドウ上で確認する事が出来るようになります。
プログラムでデータを使う
ブラウザ上で設定したデータをプログラムで使う方法は2パターンあります。
まず1つ目の方法ではプロパティを使います。
//intの値設定用のプロパティ //setがprivateでも大丈夫だが、プロパティ自体はpublicの必要がある public int TestInt { get; private set; } //以下のような形でもOK //private int _testInt; // //public int TestInt { // get => _testInt; // private set => _testInt = value; //}
Remote SettingsのコンポーネントをAddし、プロパティを実装したスクリプトをドラック&ドロップ、
さらにプロパティと、そのプロパティに設定したい値のKey(Remote Setting Key)を選択すれば、
ブラウザ上で設定した値が自動でプロパティに設定されるようになります。
Debug.Log ("TestInt : " + TestInt);
次に2つ目の方法はRemoteSettingsのGetを使って、任意のタイミングで取得する方法です。
なお、RemoteSettingsのGetはGetIntなど型ごとにメソッドが異なっており、
第1引数でKeyを、第2引数でデフォルト値(Keyで保存された値がない場合の値)を設定します。
//TestIntというKeyで保存されたintの値を取得、なければ999を取得 Debug.Log ("GetInt : TestInt " + RemoteSettings.GetInt ("TestInt", 999)); //TestInt2というKeyで保存されたintの値を取得、なければ999を取得 Debug.Log ("GetInt : TestInt2 " + RemoteSettings.GetInt ("TestInt2", 999));
どちらの方法でも注意しなければいけないのが、値のロードのタイミングです。
Awakeだと値が正常にロード出来ませんし、
Startでもキャッシュされている前の値がロードされてしまう事があります。
なので、RemoteSettings.Completedを使って、
リモートの値のロードが完了した後に、実際にその値を使うようにしましょう。
(以下はTestIntに100を設定し、その後200に変更した場合の例です)
//intの値設定用のプロパティ public int TestInt { get; private set; } private void Awake () { //Awakeでプロパティの値を確認、まだ自動設定されていないので0 Debug.Log ("Awake : " + TestInt); } private void Start() { //Startでプロパティの値を確認、前の起動時の値(キャッシュ)をロードしているので、リモートとは違う値の100 Debug.Log ("Start : " + TestInt); //ロード完了時のイベントにメソッド登録 RemoteSettings.Completed += OnCompleted; } //ロード完了 private void OnCompleted(bool wasUpdatedFromServer, bool settingsChanged, int serverResponse) { //ロード完了後のプロパティの値を確認、リモートと同じ200 Debug.Log ("OnCompleted : " + TestInt); }
ちなみに、リモートの値を自動でロードするのは起動時のみっぽい
(その後はキャッシュした値をロードしているっぽい)ので、
任意のタイミングでリモートの値を確認したい場合はForceUpdateを使います。
なお、ForceUpdateを使った後もRemoteSettings.Completedは発火します。
//リモートの値を確認 public void ForceUpdate() { Debug.Log ("ForceUpdate"); RemoteSettings.ForceUpdate(); }
おわりに
かなり簡単に使える上に無料で、色々な場面で活躍できそうですが、
アセットのエラーや警告が放置されていたり、
Samsung Galaxy S10でクラッシュするみたいなレビュー(真偽は不明)もあったりするので、
利用にはちょっと慎重になる必要があります。
ちなみに、Remote Configなるものもあるらしいので、
このタイミングだとRemote Configのほうを選んでもいいかもしれないですね。https://t.co/UIvg2Ytz3D https://t.co/oa5Riw3tIW
— かまた (@kamayuki_fs) 2019年8月27日
こちらの導入を検討してみると良いかもしれません。
なお、Remote Configについても、そのうち試して記事にする予定です。
Remote Configの記事も書きました!