Unity製ゲームで、Steamのランキング実装をするには
現状
・UnityでMac/Win向けのビルドを行なって、Steamにアップ完了
・ストアプレビューからゲームを落としてPlayできた
やりたいこと
・特定のスコアに関して、ランキングを実装したい
・資料や手順で参考になるものがあれば共有していただけると助かります
とりあえずこれかな
手順通りやったら、Steamworks.NETのサンプルを入れた時点でエラー
解説にあるPluginとEditorフォルダがなくなってる。
諦めて、公式の手順をやるか
まずは最近のパッケージをインポート
Unity プロジェクトのルートにあるsteam_appid.txtを開き、480独自の AppId に置き換える。
Unity再起動
手順通りやってたら、以下のエラーが
Steamを起動しながらじゃないとダメみたい(そんなこともあったな)
成功!
再度ブログのコードを拝借して実験: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)}");
}
}
}
ここまでくればOK
次はビルドしてテスト
うっちーの情報では落ちることがあるとか
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します