Closed14

Unity製ゲームで、Steamのランキング実装をするには

スタジオしまづスタジオしまづ

現状
・UnityでMac/Win向けのビルドを行なって、Steamにアップ完了
・ストアプレビューからゲームを落としてPlayできた

やりたいこと
・特定のスコアに関して、ランキングを実装したい
・資料や手順で参考になるものがあれば共有していただけると助かります

スタジオしまづスタジオしまづ

再度ブログのコードを拝借して実験:https://zenn.dev/studio_shimazu/scraps/c0d488975f0594#comment-d053900b4725ea
ScoreRankingの部分は自分のランキング名にする

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Steamworks;

public class SteamScript : MonoBehaviour
{
    private void Start()
    {
        if (SteamManager.Initialized)
        {
            Debug.Log($"Steamの初期化成功, AppID : {SteamUtils.GetAppID()}");
            //初期化が成功したらリーダーボードを探す
            FindLeaderboard();
        }
        else
        {
            Debug.LogWarning("Steamの初期化失敗");
        }
    }
    //=================================================================================
    //リーダーボードの取得
    //=================================================================================

    //リーダーボードの取得
    private void FindLeaderboard()
    {
        Debug.Log("リーダーボードの検索開始");

        //リーダーボード(RankingSample)を探す
        CallResult<LeaderboardFindResult_t>.Create().Set(SteamUserStats.FindLeaderboard("ScoreRanking"), OnFindLeaderboard);
    }

    //リーダーボードの取得完了
    private void OnFindLeaderboard(LeaderboardFindResult_t result, bool failure)
    {
        //リーダーボードが見つかったか判定
        if (failure || result.m_bLeaderboardFound == 0)
        {
            Debug.LogWarning("リーダーボードが見つかりませんでした");
            return;
        }
        //リーダーボードの情報表示
        var leaderboard = result.m_hSteamLeaderboard;
        Debug.Log($"リーダーボードの名前 : {SteamUserStats.GetLeaderboardName(leaderboard)}");
        Debug.Log($"リーダーボードに登録されている数 : {SteamUserStats.GetLeaderboardEntryCount(leaderboard)}");
        Debug.Log($"リーダーボードの並べ替え方法 : {SteamUserStats.GetLeaderboardSortMethod(leaderboard)}");
        Debug.Log($"リーダーボードの表示タイプ : {SteamUserStats.GetLeaderboardDisplayType(leaderboard)}");
    }
}

成功!

スタジオしまづスタジオしまづ

次はデータ送信, 一覧取得 => うまくいった

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Steamworks;

public class SteamScript : MonoBehaviour
{

    private void Start()
    {
        if (SteamManager.Initialized)
        {
            // Debug.Log($"Steamの初期化成功, AppID : {SteamUtils.GetAppID()}");
            Debug.Log($"Steamの初期化成功");
            //初期化が成功したらリーダーボードを探す
            FindLeaderboard();
        }
        else
        {
            Debug.LogWarning("Steamの初期化失敗");
        }
    }
    //=================================================================================
    //リーダーボードの取得
    //=================================================================================

    //リーダーボードの取得
    private void FindLeaderboard()
    {
        Debug.Log("リーダーボードの検索開始");

        //リーダーボード(RankingSample)を探す
        // CallResult<LeaderboardFindResult_t>.Create().Set(SteamUserStats.FindLeaderboard("ScoreRanking"), OnFindLeaderboard);
        CallResult<LeaderboardFindResult_t>.Create().Set(SteamUserStats.FindLeaderboard("ScoreRanking"), UploadScore);
        // CallResult<LeaderboardFindResult_t>.Create().Set(SteamUserStats.FindLeaderboard("ScoreRanking"), DownloadEntries);
    }

    //リーダーボードの取得完了
    private void OnFindLeaderboard(LeaderboardFindResult_t result, bool failure)
    {
        //リーダーボードが見つかったか判定
        if (failure || result.m_bLeaderboardFound == 0)
        {
            Debug.LogWarning("リーダーボードが見つかりませんでした");
            return;
        }
        //リーダーボードの情報表示
        var leaderboard = result.m_hSteamLeaderboard;
        Debug.Log($"リーダーボードの名前 : {SteamUserStats.GetLeaderboardName(leaderboard)}");
        Debug.Log($"リーダーボードに登録されている数 : {SteamUserStats.GetLeaderboardEntryCount(leaderboard)}");
        Debug.Log($"リーダーボードの並べ替え方法 : {SteamUserStats.GetLeaderboardSortMethod(leaderboard)}");
        Debug.Log($"リーダーボードの表示タイプ : {SteamUserStats.GetLeaderboardDisplayType(leaderboard)}");
    }


    //=================================================================================
    //スコアの送信
    //=================================================================================

    //スコア送信
    private void UploadScore(LeaderboardFindResult_t result, bool failure)
    {
        //リーダーボードが見つかったか判定
        if (failure || result.m_bLeaderboardFound == 0)
        {
            Debug.LogWarning("リーダーボードが見つかりませんでした");
            return;
        }

        //送信する情報
        var call = SteamUserStats.UploadLeaderboardScore(
          result.m_hSteamLeaderboard, //送信するリーダーボード 
          ELeaderboardUploadScoreMethod.k_ELeaderboardUploadScoreMethodKeepBest,//送信するスコアがベストを超えていれば更新する
          Random.Range(0,100),              //送信するスコア
          new int[0], //ユーザがスコアを獲得した方法に関する追加情報?
          0       //ユーザがスコアを獲得した方法に関する追加情報?
        );

        //スコア送信
        Debug.Log($"スコア送信開始");
        CallResult<LeaderboardScoreUploaded_t>.Create().Set(call, OnUploadScore);
    }

    //スコア送信完了
    private void OnUploadScore(LeaderboardScoreUploaded_t result, bool failure)
    {
        //スコア送信が上手くいったか判定
        if (failure || result.m_bSuccess != 1)
        {
            Debug.LogWarning("スコア送信が失敗しました");
            return;
        }
        Debug.Log($"スコア送信完了");

        //更新結果を確認
        Debug.Log($"現在のスコア : {result.m_nScore}");
        Debug.Log($"スコアが更新されたか : {result.m_bScoreChanged}");
        Debug.Log($"スコア送信前の順位 : {result.m_nGlobalRankPrevious}");
        Debug.Log($"スコア送信後の順位 : {result.m_nGlobalRankNew}");
    }


    //=================================================================================
    //順位の取得
    //=================================================================================

    //順位の取得
    private void DownloadEntries(LeaderboardFindResult_t result, bool failure)
    {
        //リーダーボードが見つかったか判定
        if (failure || result.m_bLeaderboardFound == 0)
        {
            Debug.LogWarning("リーダーボードが見つかりませんでした");
            return;
        }

        //取得する情報
        var call = SteamUserStats.DownloadLeaderboardEntries(
          result.m_hSteamLeaderboard, //送信するリーダーボード 
          ELeaderboardDataRequest.k_ELeaderboardDataRequestGlobal, //順位を取得する範囲
          0, //取得する順位の一番上
          100 //取得する順位の一番下
        );

        //順位の取得送信
        Debug.Log("順位の取得開始");
        CallResult<LeaderboardScoresDownloaded_t>.Create().Set(call, OnDownloadEntriese);
    }

    //順位の取得完了
    private void OnDownloadEntriese(LeaderboardScoresDownloaded_t result, bool failure)
    {
        //順位の取得が上手くいったか判定
        if (failure)
        {
            Debug.LogWarning("順位の取得が失敗しました");
            return;
        }
        Debug.Log($"順位の取得完了");


        //登録されている順位の個数を確認
        Debug.Log($"取得した順位の個数 : {result.m_cEntryCount}");

        //各順位の情報を確認
        for (int i = 0; i < result.m_cEntryCount; i++)
        {
            //各順位の情報を取得
            LeaderboardEntry_t leaderboardEntry;
            SteamUserStats.GetDownloadedLeaderboardEntry(result.m_hSteamLeaderboardEntries, i, out leaderboardEntry, new int[0], 0);

            //情報を表示
            Debug.Log($"順位 : {leaderboardEntry.m_nGlobalRank}");
            Debug.Log($"ID : {leaderboardEntry.m_steamIDUser}");
            Debug.Log($"スコア : {leaderboardEntry.m_nScore}");
            Debug.Log($"ユーザ名 : {SteamFriends.GetFriendPersonaName(leaderboardEntry.m_steamIDUser)}");
        }

    }
}
スタジオしまづスタジオしまづ

Mac向けのビルドでエラー

Plugin 'libsteam_api.so' is used from several locations:
Assets/Plugins/x86_64/libsteam_api.so would be copied to <PluginPath>/libsteam_api.so
Assets/Plugins/x86/libsteam_api.so would be copied to <PluginPath>/libsteam_api.so
Please fix plugin settings and try again.

x86を無効

スタジオしまづスタジオしまづ

ビルドしてもランキング取得とかできない
steam_appid.txtをMacビルドと一緒の場所におかないといけなかった

スタジオしまづスタジオしまづ

次にsteam経由で取得するとゲームできなくなってる。。。
これはSteamworksNET関係ないかもしれない。
一度もともとうまく行ってた方で確認する

=>単純にアップするフォルダ構成間違ってた
(アプリのフォルダ>アプリのフォルダ>アプリってなってた)

スタジオしまづスタジオしまづ

修正して解決。
無事Macビルド(Steam経由でプレイ)でのランキングデータ送信&取得ができた
次はWinで確認
=>問題なくいけた

ってことでとりあえずランキング実装が試せたのでCloseします

このスクラップは2021/06/03にクローズされました