C#接口介绍地址:http://steamworks.github.io/gettingstarted/
动态查看统计数据和成就解锁状态工具
首先是安装steamwork,steamwork.net有详细的说明,上篇文章中已经介绍过了:
C#官方案例中本身就已经展示了统计成就功能,我们只是需要剔除不需要的部分即可。
使用时我们需要注意以下几点,使用示例工程做测试的时候,不要改脚本里成就的ID! 它必须与Steam后台里被录入的API Name保持一致,不然你测试的时候成就是读取不到的。
如果自己添加统计数据需要先发布更新后,才可以获取到统计数据。
进行测试时需要先运行steam,否则会遇到下列报错问题:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.ComponentModel;
using Steamworks;
class AchievementManager : MonoBehaviour
{
//成就
private enum Achievement : int
{
ACH_WIN_ONE_GAME,
//有待添加
};
private Achievment_t[] m_Achievements = new Achievment_t[]
{
new Achievment_t(Achievement.ACH_WIN_ONE_GAME, "第一个成就","启动游戏立即获得"),
};
private class Achievment_t
{
public Achievement m_eAchievementID;
public string m_strName;
public string m_strDescription;
public bool m_bAchieved;
public Achievment_t(Achievement achivementID, string name, string desc)
{
m_eAchievementID = achivementID;
m_strName = name;
m_strDescription = desc;
m_bAchieved = false;
}
}
//游戏状态
private enum GameState
{
GAME_ACTIVE,
//有待添加
};
//GameID
private CGameID m_GameID;
//从Steam获取统计数据?
private bool m_bRequestedStats;
private bool m_bStatsValid;
//这一帧存储统计数据?
private bool m_bStoresStats;
//游戏数据
private int m_nTotalNumWins;
protected Callback m_UserStatsReceived;
protected Callback m_UserStatsStored;
protected Callback m_UserAchievementStored;
//把回调创建放在OnEnable方法内以确保Unity加载完成后重复创建回调
private void OnEnable()
{
if (!SteamManager.Initialized) return;
m_GameID = new CGameID(SteamUtils.GetAppID());
m_UserStatsReceived = Callback.Create(OnUserStatsReceived);
m_UserStatsStored = Callback.Create(OnUserStatsStored);
m_UserAchievementStored = Callback.Create(OnAchievementStored);
m_bRequestedStats = false;
m_bStatsValid = false;
}
private void Start()
{
m_nTotalNumWins = 0;
OnGameStateChange(GameState.GAME_ACTIVE);
}
private void Update()
{
if (!SteamManager.Initialized) return;
if (!m_bRequestedStats)
{
if (!SteamManager.Initialized)
{
m_bRequestedStats = true;
return;
}
//从 Steam 后端调出用户的统计与成就数据
bool bSuccess = SteamUserStats.RequestCurrentStats();
m_bRequestedStats = bSuccess;
}
//if (!m_bStatsValid) return;
foreach (Achievment_t achievement in m_Achievements)
{
if (achievement.m_bAchieved) continue;
switch (achievement.m_eAchievementID)
{
case Achievement.ACH_WIN_ONE_GAME:
if (m_nTotalNumWins !=0)
{UnlockAchievement(achievement);}
break;
}
}
//在游戏中的某个节点上传变更
if (m_bStoresStats)
{
SteamUserStats.SetStat("NumWins", m_nTotalNumWins);
bool bSuccess = SteamUserStats.StoreStats();
m_bStoresStats = !bSuccess;
}
}
// 数据准备完成后(RequestCurrentStats),回调
private void OnUserStatsReceived(UserStatsReceived_t pCallback)
{
if (!SteamManager.Initialized) return;
if ((ulong)m_GameID == pCallback.m_nGameID)
{
//加载成就
if (EResult.k_EResultOK == pCallback.m_eResult)
{
Debug.Log("Received stats and achievements from Steam");
m_bStatsValid = true;
foreach (Achievment_t ach in m_Achievements)
{
//迭代每项数据并初始化游戏状态
bool ret = SteamUserStats.GetAchievement(ach.m_eAchievementID.ToString(), out ach.m_bAchieved);
if (ret)
{
//在游戏里显示成就的可读属性(name&des)
ach.m_strName = SteamUserStats.GetAchievementDisplayAttribute(ach.m_eAchievementID.ToString(), "name");
ach.m_strDescription = SteamUserStats.GetAchievementDisplayAttribute(ach.m_eAchievementID.ToString(), "desc");
}
else
{
Debug.LogWarning("failed for getting achievement" + ach.m_eAchievementID);
}
}
SteamUserStats.GetStat("NumWins", out m_nTotalNumWins);
}
else
Debug.Log("RequestStats - failed, " + pCallback.m_eResult);
}
}
//回调上传的变更(StoreStats)
private void OnUserStatsStored(UserStatsStored_t pCallback)
{
if ((ulong)m_GameID == pCallback.m_nGameID)
{
if (EResult.k_EResultOK == pCallback.m_eResult)
{
Debug.Log("StroeStats-success");
}
else if (EResult.k_EResultInvalidParam == pCallback.m_eResult)
{
Debug.Log("StoreStats-failed to validate");
UserStatsReceived_t callback = new UserStatsReceived_t();
callback.m_eResult = EResult.k_EResultOK;
callback.m_nGameID = (ulong)m_GameID;
OnUserStatsReceived(callback);
}
else
{
Debug.Log("failed-StroeStats");
}
}
}
//解锁成就
private void UnlockAchievement(Achievment_t achievement)
{
achievement.m_bAchieved = true;
SteamUserStats.SetAchievement(achievement.m_eAchievementID.ToString());
m_bStoresStats = true;
}
//回调解锁的成就
private void OnAchievementStored(UserAchievementStored_t pCallback)
{
if ((ulong)m_GameID == pCallback.m_nGameID)
{
if (0 == pCallback.m_nMaxProgress)
{
Debug.Log("Achievement" +pCallback.m_rgchAchievementName+"unlocked");
}
else
{
Debug.Log("Achievement '" + pCallback.m_rgchAchievementName + "' progress callback, (" + pCallback.m_nCurProgress + "," + pCallback.m_nMaxProgress + ")");
}
}
}
//切换游戏状态
private void OnGameStateChange(GameState eNewState)
{
//if (!m_bStatsValid) return;
if (eNewState == GameState.GAME_ACTIVE)
{
m_nTotalNumWins++;
}
m_bStoresStats = true;
}