2016-06-15 18 views
4

내 응용 프로그램 (SteamWorks.NET 및 XNA 기반 C#으로 작성된 게임)에 리더 보드를 포함하려고합니다.Steamworks.NET에서 리더 보드를 만드는 방법?

스팀이 올바르게 초기화되었습니다. gamestart에

내가 전화 :

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

I 전화)

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

그리고 모든 업데이트에서 (사용 :

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

는하지만, OnLeaderboardFindResult_BetaTesters이

를 호출되지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

답변

5

이전 문제는 알고 있지만 지금은 같은 문제가 있습니다.

Steamworks.NET을 사용하여 Unity에서 Steam leaderboards를 구현하려고 할 때도 동일한 문제가있었습니다. 마지막으로 나는 원래 Steamworks C++ 샘플 프로젝트에서 작업하고 있습니다. (Steamworks.NET의 설명서는 원래 Steamworks C++과 같이 매우 열악하므로 Steamworks C++ 샘플 프로젝트에서 사용 방법을 확인해야합니다.

실수로 인해 " Callback <> "클래스 대신"Callback <> "클래스를 사용하십시오.

다음 코드는 나를 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() 메소드"로 사용합니다.

+0

추가 할 것은 한 가지입니다. 당신이 FindOrCreateLeaderboard (s_leaderboardName, ELeaderboardSortMethod.k_ELeaderboardSortMethodDescending, ELeaderboardDisplayType.k_ELeaderboardDisplayTypeNumeric) '같은 것을 사용할 수있는 리더를 만들 대신 FindLeaderboard'의'()' 당신이 인수 2로 제공 할 필요가 열거 목록 3은 여기 발견 : https://github.com/rlabrecque/Steamworks.NET/blob/d617ccdb85db1ca72af8c020e55196d7e03a53bf/Plugins/Steamworks.NET/autogen/SteamEnums.cs –

+0

감사합니다. ICoso. 실례지만, UpdateScore()를 호출하기 전에 Init()가 끝나기를 기다려야합니까? –

+0

@ChrisEmerson : 더 이상 증기로 작업하지는 않았지만 코드에서 알 수 있듯이 UpdateScore 메서드는 "s_initialized"가 true 일 때까지 아무 작업도 수행하지 않으며 FindLeaderboard 콜백이 트리거 될 때 (OnLeaderboardFindResult) true가됩니다. Init 메서드가 끝나면 비동기 "OnLeaderboardFindResult"콜백을 기다리고 있기 때문에 UpdateScore 메서드를 사용할 수 없습니다. bool 메서드를 추가하여 UpdateScore를 사용할 수 있는지 확인할 수 있습니다 (s_initialized 값이 true 인 경우). – ICoso