如何在 Steamworks.NET 中做排行榜?
How to do leaderboards in Steamworks.NET?
我正在尝试在我的应用程序中包含排行榜(用 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<>" class 而不是 "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 classes 仅用于 "console log" 消息和最后两个方法 "call each x miliseconds the SteamAPI.RunCallbacks() method"
我正在尝试在我的应用程序中包含排行榜(用 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<>" class 而不是 "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 classes 仅用于 "console log" 消息和最后两个方法 "call each x miliseconds the SteamAPI.RunCallbacks() method"