この記事は、何も考えずにログイン処理を実装する記事を呼んでいる前提で進めていきます。
PlayFabAuthService の LoginWithIOSDeviceID メソッドを見てみると、以下のようになっています。
#elif UNITY_IPHONE || UNITY_IOS && !UNITY_EDITOR
PlayFabClientAPI.LoginWithIOSDeviceID(new LoginWithIOSDeviceIDRequest()
{
TitleId = PlayFabSettings.TitleId,
DeviceModel = SystemInfo.deviceModel,
OS = SystemInfo.operatingSystem,
DeviceId = SystemInfo.deviceUniqueIdentifier,
CreateAccount = true,
InfoRequestParameters = InfoRequestParams
},
注目したいのは以下の設定です。
DeviceId = SystemInfo.deviceUniqueIdentifier,
調べると、この SystemInfo.deviceUniqueIdentifier は「変わることがある」そうです。
つまりどういうことかというと、ユーザーは端末を変えたりしていないのに、急に新規ユーザー扱いとされてしまう可能性がある、ということです。
せっかく頑張ってきたゲームの内容が全部消えてしまうと考えると、恐ろしいですね。
ということで、SystemInfo.deviceUniqueIdentifier を使わずにログインIDを生成する方法について考えてみました。
さっそく見ていきましょう。
ログイン時に「変わらないユニークキー」を使用する
結論としては、PlayerPrefs を使用すればOKです。
- Guid で ID を生成する
- 生成した ID を PlayerPrefs を使用して保存
- 2回以降のログインは、保存されている ID を使用
上記のとおり。
さらに細かく見ていきますね。
PlayerPrefs とは
PlayerPrefsとは、ローカルでゲームデータのセーブやロードができる機能です。
さらに理解を深めたい人は、【Unity入門】スコアを保存!コピペで終わるPlayerPrefsの実装方法を参照するとよいでしょう。
今回は、PlayerPrefs.GetString で値の取得を、PlayerPrefs.SetString で値の保存をします。
ログイン処理を修正する
PlayerPrefs を利用して、PlayFabAuthService のログイン処理を修正していきます。
以下の5行くらいをコピペすれば準備は完了です。
const string PLAYFAB_CUSTOM_ID = "PLAYFAB_CUSTOM_ID";
public static string CustomId { get => PlayerPrefs.GetString(PLAYFAB_CUSTOM_ID, Guid.NewGuid().ToString()); }
public void SaveCustomId()
{
PlayerPrefs.SetString(PLAYFAB_CUSTOM_ID, CustomId);
PlayerPrefs.Save();
}
あとは、SystemInfo.deviceUniqueIdentifier を CustomId に置き換えをすればOKです。
DeviceId = CustomId,
処理内容としては以下のとおりです。
- キーに一致する値が保存されている場合は、保存されている値を取得
- 保存されていない場合は、Guid を生成
- 値を保存
難しくないですね。
ここまでは iOS について見てきましたが、Android についてはどうなのでしょうか?
ソースコードを見ると以下のようになっています。
//Get the device id from native android
AndroidJavaClass up = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject currentActivity = up.GetStatic<AndroidJavaObject>("currentActivity");
AndroidJavaObject contentResolver = currentActivity.Call<AndroidJavaObject>("getContentResolver");
AndroidJavaClass secure = new AndroidJavaClass("android.provider.Settings$Secure");
string deviceId = secure.CallStatic<string>("getString", contentResolver, "android_id");
//Login with the android device ID
PlayFabClientAPI.LoginWithAndroidDeviceID(new LoginWithAndroidDeviceIDRequest() {
TitleId = PlayFabSettings.TitleId,
AndroidDevice = SystemInfo.deviceModel,
OS = SystemInfo.operatingSystem,
AndroidDeviceId = deviceId,
CreateAccount = true,
InfoRequestParameters = InfoRequestParams
ここで取得している deviceId が不変なのかどうかはよくわかりませんでした。
公式ドキュメントにも特に「Android も注意してね」と記載がなかったので大丈夫だと思いますが、iOSと同じように置き換えも可能です。
AndroidDeviceId = CustomId,
ちなみに、PlayerPrefs.Save() をしなくても、アプリ終了時などに自動で保存してくれるようです。
今回は初回ログイン後にすぐ保存したいので、明示的に Save をしようと思います。
Save は重たい処理なので頻繁に呼び出すことは推奨されていませんが、今回は初回のみ呼び出すので問題なさそうです。
公式ドキュメントでは、キーチェーンを利用した保存が推奨されていますが、いろいろと設定が大変そうなので、ここでは割愛します。
「それでも試してみたい!」という人は、iOS Keychain Plugin が役に立ちそうです。
最後に
ログインのとき、PlayerPrefs を使用してユニークキーを保存する方法について解説しました。
単純にローカルで試す分には対応しなくていいですが、リリースするとなったときには対応が必要そうですね。
細かいテストをする前までには、この記事を参考に対応してみてください。
PlayFab のことをもっと皆さんに知ってもらいたくて、合計500ページ以上にもなる書籍を5冊に分けて執筆しました。
私の知識をすべて詰め込んでいるので、ゲーム開発をさらに加速させたい方はぜひご覧ください。
このユニークキーは、Apple Developer で ビルドを再インストールするときに、Unityのデータは消えて、それだけで新規ユーザー扱いされませんか?
インストールしたアプリを削除しない限りデータは消えないと思います。