2016-06-15 18 views
4

私は自分のアプリケーション(SteamWorks.NETとXNAをベースにしたC#で書かれたゲーム)にリーダーボードを入れようとしています。Steamworks.NETのリーダーボードの操作方法は?

スチームが適切に初期化されています。

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

、すべてのアップデートでを使用して()、私は呼ん:私は呼んgamestartオン

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

はしかし、OnLeaderboardFindResult_BetaTestersが呼び出されることはありません。私は間違って何をしていますか?

答えて

5

私は古い問題ですが、私はちょうど今同じものを持っています。

Steamworks.NETを使ってUnityでSteamリーダーボードを実装しようとしたときと同じ問題がありました。 最後に、元のSteamworks C++サンプルプロジェクトから作業しています。 (Steamworks.NETのドキュメントは、元のSteamworks C++のように実際には貧弱なので、Steamworks C++サンプルプロジェクトをチェックして使用方法を確認する必要があります)

間違いがありますが、 "Callback <>"クラスではなく、 "CallResult <>"クラスを使用します。私はそれをコンパイルせずに数回、このコードを編集し、多分任意の構文エラーが含まれていますが、実装は問題ないはずですしている*

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

を:

次のコードは、私がSteamLeaderboardにユニティにスコアをアップロードすることができ

**このコードはUnity 4で使用されていますが、Unityクラスは「コンソールログ」メッセージと最後の2つのメソッド「SteamAPI.RunCallbacks()メソッドごとにxミリ秒で呼び出す」のためにのみ使用されます。

+0

追加することが1つあります。あなたは 'FindOrCreateLeaderboard(s_leaderboardName、ELeaderboardSortMethod.k_ELeaderboardSortMethodDescending、ELeaderboardDisplayType.k_ELeaderboardDisplayTypeNumeric)のようなものを使用することができるリーダーボードを作成したい、あなたは私がここで見つける引数2と3のように供給する必要がある列挙型の代わりに'の 'FindLeaderboard()' リスト: https://github.com/rlabrecque/Steamworks.NET/blob/d617ccdb85db1ca72af8c020e55196d7e03a53bf/Plugins/Steamworks.NET/autogen/SteamEnums.cs –

+0

これは素晴らしいことです、ICoso。 Update()を呼び出す前にInit()が終了するのを待つべきですか? –

+0

@ChrisEmerson: 私はもう蒸気で作業しませんでしたが、コードでわかるように、 "s_initialized"がtrueになるまでUpdateScoreメソッドは何も行いません。FindLeaderboardコールバックがトリガーされたとき(OnLeaderboardFindResult)になります。 Initメソッドが終了すると、非同期の "OnLeaderboardFindResult"コールバックを待機しているため、UpdateScoreメソッドはまだ使用できません。 必要に応じて、boolメソッドを追加してUpdateScoreが使用可能かどうかを確認できます(s_initializedの値がtrueの場合) – ICoso

関連する問題