Files
2026-03-04 10:03:45 +08:00

151 lines
4.7 KiB
C#

using System.Collections.Generic;
using System.Linq;
using Steamworks;
using UnityEngine;
namespace HeathenEngineering.SteamApi.PlayerServices
{
public class SteamworksLeaderboardManager : MonoBehaviour
{
public List<SteamworksLeaderboardData> Leaderboards;
public UnityLeaderboardRankChangeEvent LeaderboardRankChanged;
public UnityLeaderboardRankUpdateEvent LeaderboardRankLoaded;
public UnityLeaderboardRankChangeEvent LeaderboardNewHighRank;
private static SteamworksLeaderboardManager Instance;
private void Start()
{
if (Instance != null)
{
Debug.LogWarning("[SteamworksLeaderboardManager.Start] Detected a possible duplicate Steamworks Leaderboard Manager, this may cause unexpected behaviour.");
}
Instance = this;
}
private void OnEnable()
{
foreach (SteamworksLeaderboardData leaderboard in Leaderboards)
{
leaderboard.Register();
leaderboard.UserRankChanged.AddListener(HandleLeaderboardRankChanged);
leaderboard.UserRankLoaded.AddListener(HandleLeaderboardRankLoaded);
leaderboard.UserNewHighRank.AddListener(HandleLeaderboardNewHighRank);
}
}
private void HandleLeaderboardRankLoaded(LeaderboardUserData arg0)
{
LeaderboardRankLoaded.Invoke(arg0);
}
private void HandleLeaderboardRankChanged(LeaderboardRankChangeData arg0)
{
LeaderboardRankChanged.Invoke(arg0);
}
private void HandleLeaderboardNewHighRank(LeaderboardRankChangeData arg0)
{
LeaderboardNewHighRank.Invoke(arg0);
}
public SteamworksLeaderboardData GetLeaderboard(string name)
{
return Leaderboards.FirstOrDefault((SteamworksLeaderboardData p) => p.leaderboardName == name);
}
public SteamworksLeaderboardData GetLeaderboard(LeaderboardRankChangeData chageData)
{
return Leaderboards.FirstOrDefault((SteamworksLeaderboardData p) => p.leaderboardName == chageData.leaderboardName);
}
public void UploadLeaderboardScore(string boardName, int score, ELeaderboardUploadScoreMethod method)
{
SteamworksLeaderboardData steamworksLeaderboardData = Leaderboards.FirstOrDefault((SteamworksLeaderboardData p) => p.leaderboardName == boardName);
if (steamworksLeaderboardData != null)
{
steamworksLeaderboardData.UploadScore(score, method);
}
else
{
Debug.LogError("[SteamworksLeaderboardManager.UploadLeaderboardScore] Unable to locate leaderboard [" + boardName + "], make sure the board is referenced in the Steamworks Leaderboard Manager.");
}
}
public void UploadLeaderboardScore(int boardIndex, int score, ELeaderboardUploadScoreMethod method)
{
if (boardIndex > 0 && boardIndex < Leaderboards.Count)
{
SteamworksLeaderboardData steamworksLeaderboardData = Leaderboards[boardIndex];
if (steamworksLeaderboardData != null)
{
steamworksLeaderboardData.UploadScore(score, method);
}
}
else
{
Debug.LogError("[SteamworksLeaderboardManager.UploadLeaderboardScore] boardIndex is out of bounds, the value must be greater than 0 and less than Leaderboards.Count");
}
}
public void UploadLeaderboardScore(SteamworksLeaderboardData leaderboard, int score, ELeaderboardUploadScoreMethod method)
{
if (leaderboard != null)
{
leaderboard.UploadScore(score, method);
}
else
{
Debug.LogError("[SteamworksLeaderboardManager.UploadLeaderboardScore] Leaderboard is null, no score will be uploaded.");
}
}
public static void _UploadLeaderboardScore(string boardName, int score, ELeaderboardUploadScoreMethod method)
{
if (!(Instance == null))
{
SteamworksLeaderboardData steamworksLeaderboardData = Instance.Leaderboards.FirstOrDefault((SteamworksLeaderboardData p) => p.leaderboardName == boardName);
if (steamworksLeaderboardData != null)
{
steamworksLeaderboardData.UploadScore(score, method);
}
else
{
Debug.LogError("Unable to locate leaderboard [" + boardName + "], make sure the board is referenced in the Heathen Steam Manager.");
}
}
}
public static void _UploadLeaderboardScore(int boardIndex, int score, ELeaderboardUploadScoreMethod method)
{
if (Instance == null)
{
return;
}
if (boardIndex > 0 && boardIndex < Instance.Leaderboards.Count)
{
SteamworksLeaderboardData steamworksLeaderboardData = Instance.Leaderboards[boardIndex];
if (steamworksLeaderboardData != null)
{
steamworksLeaderboardData.UploadScore(score, method);
}
}
else
{
Debug.LogError("boardIndex is out of bounds, the value must be greater than 0 and less than Leaderboards.Count");
}
}
public static void _UploadLeaderboardScore(SteamworksLeaderboardData leaderboard, int score, ELeaderboardUploadScoreMethod method)
{
if (!(Instance == null))
{
Instance.UploadLeaderboardScore(leaderboard, score, method);
}
}
}
}