c# - 如何在 Steamworks.NET 中做排行榜?

标签 c# xna steam leaderboard steamworks-api

我正在尝试在我的应用程序中包含排行榜(一个用 C# 编写的游戏,使用 SteamWorks.NET 并基于 XNA)。

Steam 已正确初始化。

在游戏开始时我调用:

SteamAPICall_t hSteamAPICall = SteamUserStats.FindLeaderboard("Most active beta testers");
leaderboard_BetaTesters_ResultFindLeaderboard = Callback<LeaderboardFindResult_t>.Create(OnLeaderboardFindResult_BetaTesters);

使用

static private void OnLeaderboardFindResult_BetaTesters(LeaderboardFindResult_t pCallback)
{
// See if we encountered an error during the call
if (pCallback.m_bLeaderboardFound == 0)
  {
  Warning.Happened("Leaderboard could not be found / accessed");
  return;
  }
else
  {
  Write.Text("Steam leaderboad connected");
  }
  leaderboard_BetaTesters = pCallback.m_hSteamLeaderboard;
}

在我调用的每个 Update() 中:

if (SystemLogic.SteamInitSuccessul()) SteamAPI.RunCallbacks();

但是,永远不会调用 OnLeaderboardFindResult_BetaTesters。我做错了什么?

最佳答案

我知道这是一个老问题,但我现在遇到了同样的问题。

当我尝试使用 Steamworks.NET 在 Unity 上实现 Steam 排行榜时,我遇到了同样的问题。 最后,我从原始的 Steamworks C++ 示例项目中得到了它。 (Steamworks.NET 的文档真的很差,就像原来的 Steamworks c++ 一样,所以你必须检查 Steamworks c++ 示例项目来检查如何使用它)

你弄错了,你必须使用“CallResult<>”类而不是“Callback<>”类。

以下代码允许我将 Unity 上的分数上传到 SteamLeaderboard:

using UnityEngine;
using Steamworks;
using System.Collections;
using System.Threading;

public class SteamLeaderboards : MonoBehaviour
{
    private const string s_leaderboardName = "StoryMode";
    private const ELeaderboardUploadScoreMethod s_leaderboardMethod = ELeaderboardUploadScoreMethod.k_ELeaderboardUploadScoreMethodKeepBest;

    private static SteamLeaderboard_t s_currentLeaderboard;
    private static bool s_initialized = false;
    private static CallResult<LeaderboardFindResult_t> m_findResult = new CallResult<LeaderboardFindResult_t>();
    private static CallResult<LeaderboardScoreUploaded_t> m_uploadResult = new CallResult<LeaderboardScoreUploaded_t>();


    public static void UpdateScore(int score)
    {
        if (!s_initialized)
        {
            UnityEngine.Debug.Log("Can't upload to the leaderboard because isn't loadded yet");
        }
        else
        {
            UnityEngine.Debug.Log("uploading score(" + score + ") to steam leaderboard(" + s_leaderboardName + ")");
            SteamAPICall_t hSteamAPICall = SteamUserStats.UploadLeaderboardScore(s_currentLeaderboard, s_leaderboardMethod, score, null, 0);
            m_uploadResult.Set(hSteamAPICall, OnLeaderboardUploadResult);
        }
    }

    public static void Init()
    {
        SteamAPICall_t hSteamAPICall = SteamUserStats.FindLeaderboard(s_leaderboardName);
        m_findResult.Set(hSteamAPICall, OnLeaderboardFindResult);
        InitTimer();
    }

    static private void OnLeaderboardFindResult(LeaderboardFindResult_t pCallback, bool failure)
    {
        UnityEngine.Debug.Log("STEAM LEADERBOARDS: Found - " + pCallback.m_bLeaderboardFound + " leaderboardID - " + pCallback.m_hSteamLeaderboard.m_SteamLeaderboard);
        s_currentLeaderboard = pCallback.m_hSteamLeaderboard;
        s_initialized = true;
    }

    static private void OnLeaderboardUploadResult(LeaderboardScoreUploaded_t pCallback, bool failure)
    {
        UnityEngine.Debug.Log("STEAM LEADERBOARDS: failure - " + failure + " Completed - " + pCallback.m_bSuccess + " NewScore: " + pCallback.m_nGlobalRankNew + " Score " + pCallback.m_nScore + " HasChanged - " + pCallback.m_bScoreChanged);
    }



    private static Timer timer1; 
    public static void InitTimer()
    {
        timer1 = new Timer(timer1_Tick, null,0,1000);
    }

    private static void timer1_Tick(object state)
    {
        SteamAPI.RunCallbacks(); 
    }
}

*我已经多次编辑这段代码但没有编译它,可能包含任何语法错误,但实现应该没问题

** 还要记住这段代码已在 Unity 4 上使用,但 Unity 类仅用于“控制台日志”消息和最后两个方法“每隔 x 毫秒调用 SteamAPI.RunCallbacks() 方法”

关于c# - 如何在 Steamworks.NET 中做排行榜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37842524/

相关文章:

c# - 从另一个索引器继承文档的语法是什么?

C#合并文件可直接访问

c# - 围绕中心 vector2 点旋转对象

c# - XNA 随机选择的纹理总是选择相同的纹理

php - 使用 PHP 查找 JSON URL 响应中的特定条目

c# - CSHTML 文件未加载到 View 之外

javascript - 无法从 aspx 页面获取下拉选定值到后端

c# - MonoGame 最大化窗口事件

javascript - Node.js 机器人从消息中提取链接

python - 如何读取关键字列表并将每个关键字放在网址末尾