2019/4/28
おはようございます。
「1日3食、夜は寝る」は誰が決めたんだろうと思っている、大学生ゲーム制作者の村人Uです。
今回は、Azureが運営するPlayFabというサービスを利用して、サーバーでデータ管理をする方法について書きます。
説明はUnityを使用したものになりますが、使い方はUnity以外でもあまり変わりません。
PlayFabについては、別の記事に書きましたので今回は実際の使い方について触れていきます。
無料で使えるmBaaSのPlayFabをプレイヤーデータ管理に使ってみた by 大学生ゲーム制作者 - QUEST LAB
PlayFabでは、ユーザーがサーバーに必ずログインする必要があります。
といっても、ユーザーにIDとパスワードを決めてもらう必要はなく、こちらで勝手に決めたIDでログインができます。
//using PlayFab.ClientModels;をスクリプトの最初に記述して下さい
public static void LoginPlayFab(Action resultCallback = null)
{
var request = new LoginWithCustomIDRequest { CustomId = SystemInfo.deviceUniqueIdentifier, CreateAccount = true};
PlayFabClientAPI.LoginWithCustomID(request, result => OnLoginSuccess(result, resultCallback), OnLoginFailure);
}
上記の例で、LoginPlayFab関数を使う事でPlayFabにログインする事ができます。
なかなかヘンテコな書き方があって、見慣れないかもしれませんがPlayFabを使う場合は今後もこんな感じで書いていきます。
var request = new LoginWithCustomIDRequest { CustomId = SystemInfo.deviceUniqueIdentifier, CreateAccount = true};
この部分では、ログインするためのリクエスト文を作成しています。
この中のCustomIdがユーザーを識別するIDで、ユーザー毎にユニークな(唯一の)IDを指定する必要があります。
今回の場合は、SystemInfo.deviceUniqueIdentifier という端末ごとに違うIDを取得して利用しています。
このように、CustomIdやCreateAccountのようなPlayFabさんが事前に決めた変数名に値を代入する事でPlayFabのサーバーにどんな指示を送るか決める事が出来ます。
注)これらは、using PlayFab.ClientModels; がスクリプトの最初に記述されている必要があります。
サーバーへのログインに成功したら、データを送信する事が出来るようになります。
public static void SendUserData(){
PlayFabClientAPI.UpdateUserData(
new UpdateUserDataRequest(){
Data = new Dictionary<string, string>() {
{"Coin", "10"}
}}, result => Debug.Log("Successfully updated user data"),
error => {
Debug.Log("Got error setting user data");
Debug.Log(error.GenerateErrorReport());
});
}
これまたヘンテコなのですが、↑ではPlayFabClientAPI.UpdateUserDataという一つの関数しか使っていません。
このように関数を使う事によって、今回の場合サーバーに、「キーが"Coin"、値が"10"」のデータを送信する事が出来ます。
ちなみに、この関数は↓のような引数を取っています。
PlayFabClientAPI.UpdateUserData(UpdateUserDataRequest request , Action<UpdateUserDataResult> resultCallback, Action<PlayFabError> errorCallback);
今回の場合、この中のrequestの部分が
new UpdateUserDataRequest(){
Data = new Dictionary<string, string>() {
{"Coin", "10"}
}}
に当たり、resultCallbackが
result => Debug.Log("Successfully updated user data")
に当たり、errorCallbackが
error => {
Debug.Log("Got error setting user data");
Debug.Log(error.GenerateErrorReport());
}
に当たります。
サーバーへの送信とほぼ同じ感覚で出来ます。
public static void GetUserData(){
PlayFabClientAPI.GetUserData(
new GetUserDataRequest() {
PlayFabId = PlayerData.Instance.MyPlayFabID,
Keys = null
}, OnGetUserData
}, (error) => {
Debug.Log("Got error retrieving user data:");
Debug.Log(error.GenerateErrorReport());
});
}
public static void OnGetUserData(GetUserDataResult result){
if (result.Data == null || !result.Data.ContainsKey("Coin")) Debug.Log("No Coin");
else result => Debug.Log(result.Data["Coin"].Value);
}
↑の例では、PlayFabサーバーからユーザーデータを取得し「Coin」というキーを持つデータの値を取り出しています。
ここでもサーバーにデータを送信する時と似た感じで、次のような関数を使っています。
PlayFabClientAPI.GetUserData(GetUserDataRequest request , Action<GetUserDataResult> resultCallback, Action<PlayFabError> errorCallback
送信時と大きく違うのは、この関数の引数の内resultCallbackに当たる部分がOnGetUserDataになっているという事です。
見てもらえれば分かるように、resultCallbackの型は Action になっています。
この Action という型は、「GetUserDataResultを引数にとる関数」を表します。
なので、今回の場合OnGetUserDataというGetUserDataResultを引数に持つ関数を指定する事が出来ます。
そしてこのresultCallbackという引数ですが、これはPlayFabからデータの取得が成功した時に呼び出される関数になります。
つまり、今回の場合データの取得が完了したらOnGetUserDataという関数が呼び出されることになります。
またその時に引数に渡されるGetUserDataResultに様々な情報が格納されています。
実際には、上記のようにresult.DataにデータがDictionaryの形で格納されているのでそれを利用する事が多いと思います。
今回書いたのは、正確にはPlayFabの中のごく一部の機能であるPlayerDataについてです。
PlayFabにはデータの管理の方法だけでも
など、様々なデータの扱い方があります。
複雑に感じるかもしれませんが、逆に言うとそれだけ機能が充実しているという事でもあると思います。
詳しい説明は↓のPlayFabのドキュメントに載っています。
現時点(2019/4/28)で全て英語ですが、グーグル翻訳を使えば割と読めちゃいます。
最近のグーグル翻訳は凄いですね。
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント