はじめに
UnityでのPlayFab使用におけるログイン方法です。
前回記事での問題
こちらの記事でログインを実装しましたが、
ログインに使用する文字列は"GettingStartedGuide"の固定されたものとなっています。
(PlayFabのアカウント情報の下の方を見ると、PlayFabIDと紐づいている文字列が表示されます)
そのため、誰がログインしても同じPlayFabアカウントとなってしまうので、
端末ごとにログインに使う文字列を変えてやる必要があります。
端末ごとにログインIDを変更
そこで、端末ごとにログインできるようにしたのが下記のコードになります。
(kanさんのブログ(文末の参考を参照)内容を私でも直感的にわかるように書き換えました。)
using System; using PlayFab; using PlayFab.ClientModels; using UnityEngine; /// <summary> /// PlayFabのログイン処理を行うクラス /// </summary> public class PlayFabLogin : MonoBehaviour { private bool _shouldCreateAccount;//アカウントを作成するか private string _customID;//ログイン時に使うID //================================================================================= //ログイン処理 //================================================================================= public void Start() { Login(); } //ログイン実行 private void Login() { _customID = LoadCustomID(); var request = new LoginWithCustomIDRequest { CustomId = _customID, CreateAccount = _shouldCreateAccount };//補足 既にアカウントが作成されており、CreateAccountがtrueになっていてもエラーにはならない PlayFabClientAPI.LoginWithCustomID(request, OnLoginSuccess, OnLoginFailure); } //ログイン成功 private void OnLoginSuccess(LoginResult result) { //アカウントを作成しようとしたのに、IDが既に使われていて、出来なかった場合 if (_shouldCreateAccount == true && result.NewlyCreated == false) { Debug.LogWarning("CustomId :" +_customID+ "は既に使われています。"); Login();//ログインしなおし return; } //アカウント新規作成できたらIDを保存 if (result.NewlyCreated == true) { SaveCustomID(); Debug.Log("新規作成成功"); } Debug.Log("ログイン成功!!"); } //ログイン失敗 private void OnLoginFailure(PlayFabError error) { Debug.LogError("PlayFabのログインに失敗\n" + error.GenerateErrorReport()); } //================================================================================= //カスタムIDの取得 //================================================================================= //IDを保存する時のKEY private static readonly string CUSTOM_ID_SAVE_KEY = "CUSTOM_ID_SAVE_KEY"; //IDを取得 private string LoadCustomID() { //IDをセーブデータから取得 string id = PlayerPrefs.GetString(CUSTOM_ID_SAVE_KEY); //idの中身がnullもしくは空の文字列("")の場合は_shouldCreateAccountはtrueになる。 _shouldCreateAccount = string.IsNullOrEmpty(id); //idの中身がない場合、文字列を新規作成 if (_shouldCreateAccount==true) { return GenerateCustomID();//文字列を新規作成 } else { return id;//セーブされた文字列を返す } } //IDの保存 private void SaveCustomID() { PlayerPrefs.SetString(CUSTOM_ID_SAVE_KEY, _customID); } //================================================================================= //カスタムIDの生成 //================================================================================= //IDを生成する //ユニークな文字列をGuidを使用し生成 //https://docs.microsoft.com/ja-jp/dotnet/api/system.guid.tostring?redirectedfrom=MSDN&view=netframework-4.8#System_Guid_ToString_System_String_ private string GenerateCustomID() { //Guidの構造体生成 Guid guid = Guid.NewGuid(); return guid.ToString("N");//書式指定子はNを指定 詳細は「Guid.ToString メソッド」のドキュメント参照 } }
処理の流れとしては、こちらになります。
1.初ログイン時にIDを生成(32桁のランダムな英数字)
2.既にそのIDが使われている場合は新たにIDを生成(使われていないIDを見つけるまで)
3.ログインが成功したらIDをPlayerPrefsに保存
4.2回目以降はPlayerPrefsに保存されたIDでログイン
詳細な内容はコメントを見ていただければ把握できると思います。
ログインに使用する文字列はPlayerPrefsで保存しているので、
Androidはアプリをアンインストールしてもデータを消さない限り大丈夫ですが、
iOSの方はアプリをアンインストールすると文字列のセーブデータが消えてしまいます。
その点を理解した上で実装をお願いします。