そういうのがいいブログ

アプリ個人開発 まるブログ

アプリ開発覚え書き

【Unity】PlayFab ログイン機能の実装

はじめに

UnityでのPlayFab使用におけるログイン方法です。

前回記事での問題

marumaro7.hatenablog.com

こちらの記事でログインを実装しましたが、
ログインに使用する文字列は"GettingStartedGuide"の固定されたものとなっています。
(PlayFabのアカウント情報の下の方を見ると、PlayFabIDと紐づいている文字列が表示されます)
B96E4C057BE19AC2_»_概要_·_PlayFab.png

そのため、誰がログインしても同じ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の方はアプリをアンインストールすると文字列のセーブデータが消えてしまいます。

その点を理解した上で実装をお願いします。

参考

kan-kikuchi.hatenablog.com

kan-kikuchi.hatenablog.com