介绍

[Unity] 向 PlayFab 添加排名功能(第 1 部分)解释了如何在 Unity 上设置 PlayFab 资产。
这次,我想解释一下通过填写昵称字段和分数字段并按下发送按钮将数据发送到PlayFab并获取排名数据的程序过程。

顺便说一句,下面是一个使用排名功能的例子,在 Unityroom 中创建的游戏是首次发布的。

简单的棒球板(https://uni tyro m.kom/games/ad 用于服务器)

这是一个简单的棒球棋盘游戏,但我希望你喜欢它。
我们也会不定期发布信息,所以如果您喜欢推特关注我们也在等你。

在本文中,我将首先解释每个核心元素的代码内容,后半部分将解释获取排名数据的程序。

操作环境

  • 视窗 10
  • 统一 2019.4.40f1
  • PlayFab SDK 2.146.220816
  • PlayFab 编辑器扩展 2022/9/5 DL

使用指令

创建 C# 脚本后,添加以下 using 指令。通过添加此 using 指令,您将能够使用与 PlayFab 交互所需的方法。

using PlayFab;
using PlayFab.ClientModels;

登录

这一次,我们实现了一个匿名登录(对游戏玩家来说很容易),它不需要像电子邮件地址这样的帐户注册作为登录方法。
例如,登录过程可以通过调用Start方法等随时调用如下代码进行。请用任何用户名替换 CustomId。

PlayFabClientAPI.LoginWithCustomID(new LoginWithCustomIDRequest
{
    CustomId = "任意のユーザーID名",
    CreateAccount = true
}
, result =>
{
    Debug.Log("Success LOGIN");
}
, error =>
{
    Debug.Log(error.GenerateErrorReport());
});

更新显示名称

您可以更新排名中显示的名称。如果您不更新它,它将是登录时的 CotomId。您所要做的就是替换您要在 DisplayName 中注册的字符串类型名称。

PlayFabClientAPI.UpdateUserTitleDisplayName(
    new UpdateUserTitleDisplayNameRequest
    {
        DisplayName = "登録したい名前"
    },
    result => {
        Debug.Log("Update display name was succeeded.");
    },
    error => {
        Debug.LogError(error.GenerateErrorReport());
    }
);

统计设置

创建(或更新,如果已经存在)玩家统计数据。将创建的排名名称分配给 StatisticName,将分数分配给 Value。

PlayFabClientAPI.UpdatePlayerStatistics(new UpdatePlayerStatisticsRequest
{
    Statistics = new List<StatisticUpdate>()
    {
        new StatisticUpdate
        {
            StatisticName = "ランキング名",
            Value = スコアの数値
        }
    }
},
result => { 
    Debug.Log("success to send score");
},
error =>
{
    Debug.Log(error.GenerateErrorReport());
});

获取统计信息

从您想要获得的排名的指定点获取多人的排名列表。将要获取的排名名称分配给 StatisticName,将要获取的数据数分配给 StartPosition,将要获取多少人的数据分配给 MaxResultsCount。

PlayFabClientAPI.GetLeaderboard(new GetLeaderboardRequest
{
    StatisticName = "取得したいランキング名",
    StartPosition = 0, //ランキング1位から
    MaxResultsCount = 5 //何人分のデータを取得するか
}, result =>
{
    result.Leaderboard.ForEach(x =>
        Debug.Log($"{x.Position + 1}位:{x.DisplayName}" + $"スコア{x.StatValue}");
}, error =>
{
    Debug.Log(error.GenerateErrorReport());
});

加工流程

使用上述 API 创建一个获取排名数据的程序。处理内容如下图所示。
【Unity】PlayFabでランキング機能を追加してみる(その2)
从大小写字母和数字中创建一个随机的 16 位用户 ID (customId) 并注册以进行登录。使用这种方法,可能会覆盖 ID,但由于我们正在考虑使用免费配额(100,000 个用户)进行操作,因此几乎不会 NG。如果在不考虑 ID 创建时间的情况下执行登录注册过程,则会发生错误。
玩家填写昵称和分数(数值)并按下发送按钮。
确认用户尝试注册的昵称的字符数为(3 到 8 个字符)。这是因为 PlayFab 需要 3 到 25 个字符,并且在显示排名时考虑到框架,上限为 8 个字符。如果小于3个字符,会一直加到A变成3个字符,如果很长,从头开始限制为8个字符(InputField端也限制为8个字符)。
确认字符数后,我们将发送您的昵称和分数。
传输过程完成后,接收排名数据,并将排名内容存储在预先创建的List类型变量(内容为空)中。此时,如果在发送后立即执行接收处理,排名数据将与添加注册数据之前的数据一起显示,因此请等待1秒的间隔再执行处理。
最后,将存储在 List 类型变量中的数据粘贴到 Text 中。

预设

在 PlayFab 端,在已创建标题的设置屏幕上,转到设置按钮(齿轮标记)> 标题设置 > API 功能,选中允许客户端发布播放器统计信息,并保存。由于这赋予了客户端对发送值的权限,因此可以在播放器端执行数据操作。不建议不过这一次,由于我们不需要严格的使用限制,所以我们省去了在服务器端监控与注册数据的一致性的麻烦。
【Unity】PlayFabでランキング機能を追加してみる(その2)
您可以通过单击标题设置屏幕左侧的加入选项卡 > 排名 > 右上角的新排名按钮来创建排名。为统计信息名称输入任意名称,如果要注册的值高且排名高,则将聚合方式设置为“最大值(始终使用最大值)”。反之,如果值越小,排名越高,设置为“最大值(始终使用最小值)”。输入设置项后,点击保存按钮。
【Unity】PlayFabでランキング機能を追加してみる(その2)
您可能想在多次注册排名时使用相同的昵称。勾选“允许名字”并将默认语言设置为“日语”并保存。如果您在保存后再次检查,您将无法更改复选标记。这是不可逆转的设定所以,如果你想改变它,请在设置之前仔细检查排名注册过程的内容。这一次,我使用它是因为我希望能够使用相同的昵称进行排名显示注册。
【Unity】PlayFabでランキング機能を追加してみる(その2)

创建项目

在 Canvas 中创建用于昵称的 InputField (InputFieldName)、用于得分的 InputField (InputFieldScore)、用于发送和接收数据的按钮 (ButtonScore) 和用于显示获取数据的文本 (TextScore)。
【Unity】PlayFabでランキング機能を追加してみる(その2)

完成的脚本

排名.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using PlayFab;
using PlayFab.ClientModels;
using UnityEngine.UI;
using System;
using System.Text;
using System.Threading.Tasks;

public class Ranking : MonoBehaviour
{
    private InputField inputFieldName; //nickname
    private InputField inputFieldScore; //score
    private List<string> list = new List<string>(); //Input score ranking

    [SerializeField]
    private Text userName = default; //inputFieldName component
    [SerializeField]
    private GameObject scoreObject = null; //Textscore component

    // Start is called before the first frame update
    void Start()
    {
        //get random custom id
        var customId = GenerateCustomID();

        //get buttons object
        inputFieldName = GameObject.Find("InputFieldName").GetComponent<InputField>();
        inputFieldScore = GameObject.Find("InputFieldScore").GetComponent<InputField>();

        //wait 1sec before login
        StartCoroutine(DelayLoginMethod(1.0f, customId));
    }

    //characters to create ID
    private static readonly string characterId = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmmnopqrstuvwxyz";
    private string GenerateCustomID()
    {
        int idLength = 16;
        StringBuilder stringBuilder = new StringBuilder(idLength);
        var random = new System.Random();

        //create random ID
        for (int i = 0; i < idLength; i++)
        {
            stringBuilder.Append(characterId[random.Next(characterId.Length)]);
        }

        return stringBuilder.ToString();
    }

    //Coroutine for delay method
    private IEnumerator DelayLoginMethod(float waitTime, string customId)
    {
        yield return new WaitForSeconds(waitTime);
        Login(customId);
    }

    //User Login
    public void Login(string customId)
    {
        PlayFabClientAPI.LoginWithCustomID(new LoginWithCustomIDRequest
        {
            CustomId = customId,
            CreateAccount = true
        }
        , result =>
        {
            Debug.Log("Success LOGIN");
        }
        , error =>
        {
            Debug.Log(error.GenerateErrorReport());
        });
    }

    //click to update name
    public void OnClickName()
    {
        Button btn = GetComponent<Button>();
        btn.interactable = false;

        string name = userName.text.ToString();
        if(name.Length < 3)
        {
            int nameLength = name.Length;
            for (int i = 0; i < 3 - nameLength; i++)
            {
                name += "A";
            }
        }
        else if (name.Length > 8)
        {
            name = name.Substring(0, 8);
        }

        UpdateDisplayName(name);
    }

    //Update User Data
    public void UpdateDisplayName(string displayName)
    {
        PlayFabClientAPI.UpdateUserTitleDisplayName(
            new UpdateUserTitleDisplayNameRequest
            {
                DisplayName = displayName
            },
            result => {
                Debug.Log("Update display name was succeeded.");
                SubmitScore(int.Parse(inputFieldScore.text.ToString()));
            },
            error => {
                Debug.LogError(error.GenerateErrorReport());
            }
        );
    }

    //Send Statistic information
    public void SubmitScore(int playerScore)
    {
        PlayFabClientAPI.UpdatePlayerStatistics(new UpdatePlayerStatisticsRequest
        {
            Statistics = new List<StatisticUpdate>()
            {
                new StatisticUpdate
                {
                    StatisticName = "HighScore",
                    Value = playerScore
                }
            }
        },
        result => { 
            Debug.Log("success to send score");
            Invoke("RequestLeaderBoard", 1);
        },
        error =>
        {
            Debug.Log(error.GenerateErrorReport());
        });
    }

    //Read Statistic information
    public void RequestLeaderBoard()
    {
        PlayFabClientAPI.GetLeaderboard(new GetLeaderboardRequest
        {
            StatisticName = "HighScore",
            StartPosition = 0,
            MaxResultsCount = 5
        }, result =>
        {
            result.Leaderboard.ForEach(x =>
                list.Add(($"{x.Position + 1}位:{x.DisplayName}" + $"スコア{x.StatValue}").ToString())
            );
            PasteText();
        }, error =>
        {
            Debug.Log(error.GenerateErrorReport());
        });
    }

    public void PasteText()
    {
        Text scoreText = scoreObject.GetComponent<Text>();
        foreach (string lt in list)
        {
            scoreText.text += lt + "\n";
        }
    }
}

创建排名函数的脚本附加到 ButtonScore。在脚本变量中,UserName 设置为 InputFieldName 的 TextName,Score Object 设置为 TextScore。单击按钮时,设置附加到 ButtonScore 的 Ranking 脚本的 OnClickName 方法。
【Unity】PlayFabでランキング機能を追加してみる(その2)

操作检查

如果在 InputFieldName 中输入“test0201”,在 InputFieldScore 中输入“3100”,然后按 ButtonScore,就会得到第 1 到第 5 的排名数据,并显示在 TextScore 中。此外,我能够确认即使使用相同的昵称也可以注册。
【Unity】PlayFabでランキング機能を追加してみる(その2)

最后

为了将PlayFab的排名功能融入到游戏中,我将这次介绍的内容学习了一遍,然后融入到游戏中。感谢您,我们能够添加排名功能而没有任何重大问题。最初的设计并不好,所以我想在未来改进UI。另外,这次写的时候,我能够再次确认内容,所以我认为我能够使代码更智能。特别是,我比以往任何时候都更多地使用协程和 Invoke 来控制 PlayFab 端的发送和接收时间,但我认为我能够通过在结果端调用函数将其修复为更简洁的代码。

以后想发一篇关于自己做的棒球桌游的处理的文章,或者看到这篇文章的反响再想一想。任何意见将不胜感激。
简单的棒球板(https://uni tyro m.kom/games/ad 用于服务器)
非常感谢。


原创声明:本文系作者授权爱码网发表,未经许可,不得转载;

原文地址:https://www.likecs.com/show-308626760.html

相关文章: