(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

(:3[kanのメモ帳]

サーバーサイド不要&無料でゲーム内のデータをリモートで変更出来るUnity公式の機能 Remote Settings【Unity】【Unity Services】


このエントリーをはてなブックマークに追加

この記事でのバージョン
Unity 2018.4.6f1


はじめに

Unityはエディタだけでなく、Unity AdsUnity Analyticsなどの




便利なサービスをUnity Servicesという形で提供しています。

Unity は、ゲーム開発はもとより、オーディエンスをひきつけ、維持し、収益につなげるさまざまな無料サービスを提供しています。


そんなUnity Servicesの中(のUnity Analyticsの中)にRemote Settingsというサービスがある事を

以下の動画で知ったので、試してみて、導入や使い方をまとめてみました!



イメージとしては以下のような感じで、

ブラウザ上で設定したデータを、プログラムで簡単に取得出来るといったもの。

f:id:kan_kikuchi:20190827062021g:plain


もちろん、サーバーサイドの準備や実装は必要ありませんし、

無料で使う事が出来ます!(これ以上使ったら有料みたいなのもなし)


残念ながらゲーム側からデータを送る事は出来ませんが、それでも

ゲームバランスに関わる値の調整、ゲーム内イベントのデータやフラグ管理、広告の配信比率

など、様々な用途に使えるので、覚えておいて損はないと思います。


導入(ブラウザ編)

それでは早速、Remote Settingsの導入方法の解説です。

まず、Unityエディタの右上にある雲のボタンを押します。

f:id:kan_kikuchi:20190824055336j:plain


すると、Unity Servicesのウィンドウが開かれるので、organizationを選択し、

Createボタン押して、Unity Services上にProject IDを作成します。

f:id:kan_kikuchi:20190824055556j:plain


なお、Remote SettingsはAnalytics内の機能なのでAnalyticsをONにします。

f:id:kan_kikuchi:20190824060610j:plain


次にGo to Dashboardからダッシュボードをブラウザで開き、

f:id:kan_kikuchi:20190824055605j:plain


Analyticsの欄をクリックし、

f:id:kan_kikuchi:20190824060026j:plain


Remote Settingsを選ぶと、値の追加や確認をするページを開きます。

値を追加する時はADD NEW KEY-VALUEの所を押します。

f:id:kan_kikuchi:20190824074344j:plain
f:id:kan_kikuchi:20190824074423j:plain


ちなみに設定できる型はfloat, int, long, bool, stringです。

f:id:kan_kikuchi:20190827050048j:plain


値の追加や変更をしたらSync押してデータを同期(保存)させるのも忘れずに。

f:id:kan_kikuchi:20190824074406j:plain


なお、データはRELEASEとDEVELOPMENTに分けて設定が出来ますが、

f:id:kan_kikuchi:20190827045955j:plain


エディタ上やDevelopment Buildが有効な時はDEVELOPMENTのデータを使い、

それ以外の場合の時はRELEASEのデータを使う、

という感じで自動で読み込み先が変わるようになっています。

f:id:kan_kikuchi:20190827050003j:plain



導入(Unity エディタ編)

ブラウザ上の設定は以上ですが、エディタ上でもちょっと設定が必要です。

まず、Remote Settingsのアセットをインストールします。



インストールするといきなりエラーが出るので、(おそらくUnity2018.1以降)

f:id:kan_kikuchi:20190824061416j:plain


RemoteSettingsLinker.csを以下のようにコメントアウトします。

f:id:kan_kikuchi:20190824071911j:plain


エラーが出なくなったらWindow/Unity Analytics/Remote Settings

からRemote Settings用のウィンドウを開きます。

f:id:kan_kikuchi:20190824074442j:plain


ウィンドウを開いたらLook up the keyの所を押してブラウザを開き、

f:id:kan_kikuchi:20190824074506j:plain


Project Secret Keyの所をコピーし、先程のウィンドウにペースト後、Nextボタンを押します。

f:id:kan_kikuchi:20190824074513j:plain


これで先程ブラウザ上で設定した値を、ウィンドウ上で確認する事が出来るようになります。

f:id:kan_kikuchi:20190827051202j:plain



プログラムでデータを使う

ブラウザ上で設定したデータをプログラムで使う方法は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)を選択すれば、

f:id:kan_kikuchi:20190827051235j:plain


ブラウザ上で設定した値が自動でプロパティに設定されるようになります。

Debug.Log ("TestInt : " + TestInt);
f:id:kan_kikuchi:20190827051413j:plain


次に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));
f:id:kan_kikuchi:20190827051744j:plain


どちらの方法でも注意しなければいけないのが、値のロードのタイミングです。

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);
}
f:id:kan_kikuchi:20190827055806j:plain


ちなみに、リモートの値を自動でロードするのは起動時のみっぽい

(その後はキャッシュした値をロードしているっぽい)ので、

任意のタイミングでリモートの値を確認したい場合はForceUpdateを使います。

なお、ForceUpdateを使った後もRemoteSettings.Completedは発火します。

//リモートの値を確認
public void ForceUpdate() {
  Debug.Log ("ForceUpdate");
  RemoteSettings.ForceUpdate();
}
f:id:kan_kikuchi:20190827060322j:plain



おわりに

かなり簡単に使える上に無料で、色々な場面で活躍できそうですが、

アセットのエラーや警告が放置されていたり、

Samsung Galaxy S10でクラッシュするみたいなレビュー(真偽は不明)もあったりするので、

利用にはちょっと慎重になる必要があります。


ちなみに、Remote Configなるものもあるらしいので、



こちらの導入を検討してみると良いかもしれません。

なお、Remote Configについても、そのうち試して記事にする予定です。

Remote Configの記事も書きました!

f:id:kan_kikuchi:20190908045625g:plain