2016-06-15 11 views
4

Ich versuche, Leaderboards in meine Anwendung (ein Spiel in C#, mit SteamWorks.NET und basierend auf XNA) zu integrieren.Wie man Bestenlisten in Steamworks.NET macht?

Dampf ist ordnungsgemäß initialisiert.

Auf Spielstart Ich nenne:

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; 
} 

Und in jedem Update mit() Ich nenne:

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

jedoch OnLeaderboardFindResult_BetaTesters nie genannt wird. Was mache ich falsch?

Antwort

5

Ich weiß, ist ein altes Problem, aber ich habe das gleiche gerade jetzt.

Ich habe das gleiche Problem, wenn ich versucht, Steam-Bestenlisten auf Unity mit Steamworks.NET zu implementieren. Endlich funktioniert es aus dem ursprünglichen Steamworks C++ - Beispielprojekt. (Die Dokumentation für Steamworks.NET ist wirklich schlecht, wie das Original Steamworks C++, also müssen Sie das Steamworks C++ - Beispielprojekt überprüfen, um zu überprüfen, wie man es benutzt)

Sie haben einen Fehler, Sie müssen den " CallResult <> "Klasse statt des" Callback <> "eins.

Der folgende Code erlaubte ich Partituren für die Einheit zu einem SteamLeaderboard hochladen:

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(); 
    } 
} 

* ich mehrmals diesen Code bearbeitet haben, ohne zu kompilieren, und vielleicht enthalten jeden Syntaxfehler, aber die Umsetzung sollte in Ordnung sein

** Denken Sie auch daran, dass dieser Code auf Unity 4 verwendet wurde, aber die Unity-Klassen nur für "Konsolenprotokoll" -Nachrichten verwendet werden und die letzten beiden Methoden "x Millisekunden die SteamAPI.RunCallbacks() -Methode"

aufrufen
+0

Eine Sache hinzuzufügen, wenn Sie Ich möchte etwas wie 'FindOrCreateLeaderboard (s_leaderboardName, ELeaderboardSortMethod.k_ELeaderboardSortMethodDescending, ELeaderboardDisplayType.k_ELeaderboardDisplayTypeNumeric);' anstelle von 'FindLeaderboard()' Die Liste der enums, die Sie als Args 2 und 3 liefern müssen, habe ich hier gefunden : https://github.com/rlabrecque/Steamworks.NET/blob/d617ccdb85db1ca72af8c020e55196d7e03a53bf/Plugins/Steamworks.NET/autogen/SteamEnums.cs –

+0

Das ist ein großes Dankeschön, ICoso. Entschuldigen Sie mein Noobness, aber wie sollte man warten, bis Init() beendet ist, bevor UpdateScore() aufgerufen wird? –

+0

@ChrisEmerson: Ich habe nicht mehr mit Dampf gearbeitet, aber wie ich im Code sehe, wird die UpdateScore-Methode nichts tun, bis "s_initialized" wahr ist, was wahr wird, wenn der FindLeaderboard-Callback ausgelöst wird (OnLeaderboardFindResult). Wenn die Init-Methode abgeschlossen ist, ist die UpdateScore-Methode noch nicht verfügbar, da auf den asynchronen Rückruf "OnLeaderboardFindResult" gewartet wird. Wenn Sie möchten, können Sie eine bool-Methode hinzufügen, um zu prüfen, ob der UpdateScore verfügbar ist (wenn s_initialized Wert wahr ist) – ICoso