ゲーム制作勉強中!あこがれだったプログラマーに今からなろう!

昔、あこがれていたプログラマー。今からでも勉強してみようと思い立ち、チャレンジ開始! 勉強メモや、悪戦苦闘な日々の記録です。

Unity+PlayFabでランキング機能を作る(2)

Playfabでのランキング実装の続き。

あのあと、色々と実験していて判ったことだが、

var guid=System.Guid.NewGuid();

でのGUID生成は、毎回起動のたびに行われるので、今のままでは起動するたびに、Playfabに新しいアカウントが登録されてしまう。
これは流石に都合が悪いので、ゲーム起動時のランキング取得は管理者用のアカウントで行い、ランキングインした時だけプレイヤーアカウントを生成するようにした。
これで、無数にアカウントが生成されるのを多少は制限できると思う。

ゲーム終了時に今回のスコアと、取得しておいたランキングのスコアを比較してランキングインしたかどうかを判定する。

ランキングインしていたら、InputFieldを表示させて、プレイヤー名を取得し、
その名前をカスタマIDにして新しいアカウントを生成。
ついでに、InputFieldの名前をDisplayNameに設定することにした。

ランキングインしたかどうかの判定について、パッと思いつかなかったので、今日のところはかなり力技にしている😅
もっとスマートにできると思うので、そのうちに修正しよう🤣

コードはこんな感じだ。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine.UI;

public class ScoreUPserver : MonoBehaviour
{
    public Text [] texts; 
    public int RankingIn=0;
    public InputField inputField;
    public bool _Send=false;

    public GameObject rankintext;
    public GameObject yournametext;
    public GameObject button;
    public Button retrybutton;
    
    void Start()
    {   
        rankintext.SetActive(false);
        yournametext.SetActive(false);
        button.SetActive(false);
        inputField.gameObject.SetActive(false);    

        RankingCheck();
        RequestLeaderBoard();
    }

    void RankingCheck()//だいぶ力技(苦笑)
    {
        for (int i = 5; i >0; i--)
        {
            Debug.Log(i);
            Debug.Log(GameManager.Instance.scrnkingScore[i-1]);
            if(GameManager.Instance.Score.Value>=GameManager.Instance.scrnkingScore[i-1])
            {
                RankingIn=i;
            }  
            else
            {
                break;
            }            
        }

        if(RankingIn>0)
        {
            rankintext.SetActive(true);
            yournametext.SetActive(true);
            button.SetActive(true);
            inputField.gameObject.SetActive(true);    

            Debug.Log(RankingIn);
            switch(RankingIn){
                case 1:
                    GameManager.Instance.scrnkingScore[4]=GameManager.Instance.scrnkingScore[3];
                    GameManager.Instance.scrnkingName[4]=GameManager.Instance.scrnkingName[3];

                    GameManager.Instance.scrnkingScore[3]=GameManager.Instance.scrnkingScore[2];
                    GameManager.Instance.scrnkingName[3]=GameManager.Instance.scrnkingName[2];

                    GameManager.Instance.scrnkingScore[2]=GameManager.Instance.scrnkingScore[1];
                    GameManager.Instance.scrnkingName[2]=GameManager.Instance.scrnkingName[1];

                    GameManager.Instance.scrnkingScore[1]=GameManager.Instance.scrnkingScore[0];
                    GameManager.Instance.scrnkingName[1]=GameManager.Instance.scrnkingName[0];

                    GameManager.Instance.scrnkingScore[0]=GameManager.Instance.Score.Value;
                    GameManager.Instance.scrnkingName[0]="Rank In!!";

                break;

                case 2:
                    GameManager.Instance.scrnkingScore[4]=GameManager.Instance.scrnkingScore[3];
                    GameManager.Instance.scrnkingName[4]=GameManager.Instance.scrnkingName[3];

                    GameManager.Instance.scrnkingScore[3]=GameManager.Instance.scrnkingScore[2];
                    GameManager.Instance.scrnkingName[3]=GameManager.Instance.scrnkingName[2];

                    GameManager.Instance.scrnkingScore[2]=GameManager.Instance.scrnkingScore[1];
                    GameManager.Instance.scrnkingName[2]=GameManager.Instance.scrnkingName[1];

                    GameManager.Instance.scrnkingScore[1]=GameManager.Instance.Score.Value;
                    GameManager.Instance.scrnkingName[1]="Rank In!!";

                break;

                case 3:
                    GameManager.Instance.scrnkingScore[4]=GameManager.Instance.scrnkingScore[3];
                    GameManager.Instance.scrnkingName[4]=GameManager.Instance.scrnkingName[3];

                    GameManager.Instance.scrnkingScore[3]=GameManager.Instance.scrnkingScore[2];
                    GameManager.Instance.scrnkingName[3]=GameManager.Instance.scrnkingName[2];

                    GameManager.Instance.scrnkingScore[2]=GameManager.Instance.Score.Value;
                    GameManager.Instance.scrnkingName[2]="Rank In!!";

                break;

                case 4:
                    GameManager.Instance.scrnkingScore[4]=GameManager.Instance.scrnkingScore[3];
                    GameManager.Instance.scrnkingName[4]=GameManager.Instance.scrnkingName[3];

                    GameManager.Instance.scrnkingScore[3]=GameManager.Instance.Score.Value;
                    GameManager.Instance.scrnkingName[3]="Rank In!!";

                break;

                case 5:
                    GameManager.Instance.scrnkingScore[4]=GameManager.Instance.Score.Value;
                    GameManager.Instance.scrnkingName[4]="Rank In!!";

                break;
            }
        }
    }

    void RequestLeaderBoard()//スコアボード表示用
    {
                for (int i = 0; i < 5; i++)
                {
                    texts[i].text=GameManager.Instance.scrnking[i]+". "+
                                    GameManager.Instance.scrnkingName[i]+" "+
                                    GameManager.Instance.scrnkingScore[i];
                }
    }

    public void SendRanking()
    {
        if(!_Send)
        {
            _Send=true;
            inputField.interactable=false;
            retrybutton.interactable=false;
            PlayFabClientAPI.LoginWithCustomID(
            new LoginWithCustomIDRequest { CustomId = inputField.text, CreateAccount = true}, //Inputfieldの名前でアカウント作成。
            result => Debug.Log("ログイン成功!"),
            error => Debug.Log("ログイン失敗"));

            Invoke("SubmitScore",2f); //ログインの時差を待ってスコア送信
        }
    }


   void SubmitScore()
    {

        var request = new UpdateUserTitleDisplayNameRequest
        {
            DisplayName = inputField.text//PlayfabのアカウントにDisplayName(ランキングに表示される名前)を設定
        };
        
        PlayFabClientAPI.UpdateUserTitleDisplayName(request, OnSuccess, OnError);

        void OnSuccess(UpdateUserTitleDisplayNameResult result)
        {
            Debug.Log("成功");
        }

        void OnError(PlayFabError error)
        {
            Debug.Log($"{error.Error}");
        }

        //Debug.Log("koko");
        PlayFabClientAPI.UpdatePlayerStatistics(
            new UpdatePlayerStatisticsRequest
            {
                Statistics = new List<StatisticUpdate>()
                {
                    new StatisticUpdate
                    {
                        StatisticName = "HighScore",
                        Value = GameManager.Instance.Score.Value //スコアを送信
                    }
                }
            },
            result =>
            {
                Debug.Log("スコア送信");
            },
            error =>
            {
                Debug.Log("スコア失敗");
                // Debug.Log(error.GenerateErrorReport());
            }
            );
            retrybutton.interactable=true;
    }



    public void RealTimeText()
    {
        texts[RankingIn-1].text=(RankingIn)+". "+
                            inputField.text+" "+
                            GameManager.Instance.Score.Value;
    }
}

Playfabの勉強がまだまだなので、だいぶ課題が残っている。
例えば、InputFieldで取得した名前でアカウントを作成後、2秒待っているが、Playfabとの接続に遅延が発生したりしてアカウント作成が間に合わなかった場合、管理者用のアカウントのDisplayNameがInputFieldで取得した名前に変えられてしまう。

Playfab関係のコードは、ほぼ先人の方々のコピペなので、もっとスマートな書き方があると思うのだが、とりあえず、今日のところはここまで🤣

PlayFabの本を注文しているので、届いたらそれで勉強してみよう😃

www.youtube.com