強火で進め

このブログではプログラム関連の記事を中心に書いてます。

サーバ側で値の変更が可能なサービス「Remote Settings」


https://unity3d.com/jp/unity/features/analytics#remote-settings

Unity のサーバサイド(クラウド)のサービスにサーバ側で値の変更が可能なサービス「Remote Settings(リモート設定)」が追加されました。
※現在、ベータ。WebGL 環境には未対応。

【公式のブログ記事】

Introducing Remote Settings: Update your game in an instant – Unity Blog
https://blogs.unity3d.com/jp/2017/06/02/introducing-remote-settings-update-your-game-in-an-instant/


こちらの動画にて活用例が紹介されています。
サーバ側で「Halloween」と変更するとハロウィンの背景に、「Christmas」に変更するとクリスマスの背景になる様子が確認出来ます。

この様にアプリ側には事前にハロウィンやクリスマスのデータを入れておいて、実際にその時期になったらサーバ側で設定されている文字列を変更して表示を切り替えるといった使い方が可能です。

なお、利用可能な型はこちら

  • float
  • int
  • bool
  • string

Remote Settings は Analytics の機能の1つという位置づけの様で、 Analytics のダッシュボードから設定が可能です。

使い方

データの準備

まずは普通にプロジェクトを新規作成した後に画面右上の雲のアイコンをクリックし、Unityのクラウドサービスのウィンドウを表示、Go to Dashboard のリンクをクリックしブラウザ上でプロジェクトのページを表示します。


Analytics を開き、


Remote Settings タブを選択。


データ設定は以下の様に成っています。 Add ボタンを押すと追加できます。


以下の画像の様に作成して下さい。
※型の指定にご注意下さい。


Sync ボタンを押して編集を確定させます。

SDK のインポート

Asset Store のこちらのページから SDK をインポートします。


メニューから Window > Unity Analytics > Remote Settings と選択。


ここでは Project Secret Key を設定する必要が有ります。
Webページに戻って画面右端の ︙ をクリックした後、設定をクリック。


表示された画面の中から Project Secret Key を探し、そこに記載されている文字列を先程のウィンドウにコピペします。

Next ボタンを押すとWebページで入力した値が表示されます。

プログラムで使う

(1) RemoteSettings という名前で「空のGameObject」を作成し、 RemoteSettings スクリプトを追加。

(2) 以下のプログラムを Test という名前で C# Script として作成。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Test : MonoBehaviour {
	public float FloatVal{ get; set; }
	public int IntVal{ get; set; }
	public bool BoolVal{ get; set; }
	public string StringVal{ get; set; }

	void Start () {
		// このタイミングではデータがダウンロードされてない場合が有る
		Debug.Log (FloatVal);
		Debug.Log (IntVal);
		Debug.Log (BoolVal);
		Debug.Log (StringVal);

		RemoteSettings.Updated += 
			new RemoteSettings.UpdatedEventHandler (HandleRemoteUpdate);
	}

	private void HandleRemoteUpdate() {
		// このイベントが呼ばれた後にデータを使うと確実に
		// サーバ上のデータが適用済み
		Debug.Log ("*****Updated event");
		Debug.Log (FloatVal);
		Debug.Log (IntVal);
		Debug.Log (BoolVal);
		Debug.Log (StringVal);
		Debug.Log ("------------------");
		Debug.Log ( RemoteSettings.GetFloat ("FloatVal", 999.0f) );
		Debug.Log ( RemoteSettings.GetInt ("IntVal", 999) );
		Debug.Log ( RemoteSettings.GetBool ("BoolVal", true) );
		Debug.Log ( RemoteSettings.GetString ("StringVal", "") );

		// 定義されてないKey名が指定された場合には第二引数に指定したデフォルト値が返されます
		Debug.Log ( RemoteSettings.GetString ("Str", "Hoge") );
	}
}

(3) Test という名前で「空のGameObject」を作成し、 (2) で作成したスクリプトを追加。
(4) RemoteSettings の Inspector で以下の様に設定

(5) メニューから Edit > Project Settings > Script Execution Order と選択し、 RemoteSettings の優先順位を「Default Time」より先にします(ここでは -100 に指定)。

プログラムの解説

ここまでの作業により今回使用したプログラムの public で定義された変数に Remote Settings のサーバで定義した値が代入される様になります。
プログラム内のコメントにも記載しましたが実際には初回起動時にはまだデータがダウンロードされておらず初期のままになる事に注意して下さい。
データがダウンロードされてキャッシュ済みであればこのタイミングで値が入っています。

確実にサーバで定義された値を使いたい場合には RemoteSettings.Updated のイベントが発生した後にその変数を使用するのがベストです。
このイベントは Updated という名前ですが実際には値がアップデートされたタイミング以外にもアプリ起動時にサーバのデータを確認したタイミングでも呼ばれる様です。

なお、実際に動作させると分かりますがサーバで int 型で定義した値は現在は(恐らくバグで) Editor 上では正常に取得出来ない様です(※ iOS/Android の実機では正常に取得できました)。

開発中とリリース時

開発中とリリース時に使用する値を分けたい場合にはサーバで Configuration を切り替えてデータを用意します。
Development で作成したデータは Unity エディタ上で Development Build にチェックを付けてビルドした時、 Release で作成したデータはチェックを付けてない時に使用されます。

ドキュメント

すごく仮な感じのものですがこちらにドキュメントが有ります。