VR越来越热,这个时间节点psvr还没正式发行,HTCvive属于VR设备里体验比较优秀的设备。开发vive应用上线主要有两个渠道,viveport官方商店及steam。两者官方都有详细的文档,但是上线steam平台,若是接入steamworks SDK可以提供更好的体验。steam官方提供的SDK都是C++代码,作为一个码农混子对C++只能一知半解。在选择sdk接入时找到别人用C#封装的原生steamworks SDK,官方链接:https://steamworks.github.io/。上述链接包含文档及sdk下载地址。接入时发现能查到的资料比较有限,自己在这尝试简单总结一下方便以后再次接入也希望能提供更容易理解的帮助。
导入SDK后主要脚本SteamManager,提供了Steamworks.NET的一些基础API供大家使用。
此SDK涵盖了原生steamworks提供的大部分功能,如:状态存储及成就,排行榜,用户授权,比赛安排,steam云等等功能,文档中都有详细的概述。使用过程中也发现他们很细心的使用了和C++相同的方法名来封装了C#的方法,这样在使用过程中对照这官方的文档可以轻易在sdk中找到自己需要调用的api。由于我的需求目前只限于成就、排行榜及用户状态量存储,以下都会围绕这三个模块展开。
首先第一步,作为测试,可以新脚本SteamScript.cs并加入如下代码:
public class SteamScript : MonoBehaviour {
void Start() {
if(SteamManager.Initialized) {
string name = SteamFriends.GetPersonaName();
Debug.LogError(name);
}
}
}
注意我们在调用任何Steamworks方法前需要先确认steam是否初始化完成,即SteamManager.Initialized。
SDK主要使用回调方式从服务器异步获取需要的数据避免暂停游戏进程。要使用此SDK的回调,必须在类中先定义protected Callback<T>作为一个成员变量注册到回调。如:
public class SteamScript : MonoBehaviour {
protected Callback<GameOverlayActivated_t> m_GameOverlayActivated;
}
然后可以利用Callback<T>.Create()创建回调。通常把回调创建放在OnEnable方法内以确保Unity加载完成后重复创建回调。如:
public class SteamScript : MonoBehaviour {
private CallResult<NumberOfCurrentPlayers_t> m_NumberOfCurrentPlayers;
private void OnEnable() {
if (SteamManager.Initialized) {
m_NumberOfCurrentPlayers = CallResult<NumberOfCurrentPlayers_t>.Create(OnNumberOfCurrentPlayers);
}
}
private void OnNumberOfCurrentPlayers(NumberOfCurrentPlayers_t pCallback, bool bIOFailure) {
if (pCallback.m_bSuccess != 1 || bIOFailure) {
Debug.Log("There was an error retrieving the NumberOfCurrentPlayers.");
}
else {
Debug.Log("The number of players playing your game: " + pCallback.m_cPlayers);
}
}
}
关于回调的结果,声明CallResult<T>接收。
public class SteamScript : MonoBehaviour {
private CallResult<NumberOfCurrentPlayers_t> m_NumberOfCurrentPlayers;
private void OnEnable() {
if (SteamManager.Initialized) {
m_NumberOfCurrentPlayers = CallResult<NumberOfCurrentPlayers_t>.Create(OnNumberOfCurrentPlayers);
}
}
private void OnNumberOfCurrentPlayers(NumberOfCurrentPlayers_t pCallback, bool bIOFailure) {
if (pCallback.m_bSuccess != 1 || bIOFailure) {
Debug.Log("There was an error retrieving the NumberOfCurrentPlayers.");
}
else {
Debug.Log("The number of players playing your game: " + pCallback.m_cPlayers);
}
}
}
完整的调用方法如下:
public class SteamScript : MonoBehaviour {
private CallResult<NumberOfCurrentPlayers_t> m_NumberOfCurrentPlayers;
private void OnEnable() {
if (SteamManager.Initialized) {
m_NumberOfCurrentPlayers = CallResult<NumberOfCurrentPlayers_t>.Create(OnNumberOfCurrentPlayers);
}
}
private void Update() {
if(Input.GetKeyDown(KeyCode.Space)) {
SteamAPICall_t handle = SteamUserStats.GetNumberOfCurrentPlayers();
m_NumberOfCurrentPlayers.Set(handle);
Debug.Log("Called GetNumberOfCurrentPlayers()");
}
}
private void OnNumberOfCurrentPlayers(NumberOfCurrentPlayers_t pCallback, bool bIOFailure) {
if (pCallback.m_bSuccess != 1 || bIOFailure) {
Debug.Log("There was an error retrieving the NumberOfCurrentPlayers.");
}
else {
Debug.Log("The number of players playing your game: " + pCallback.m_cPlayers);
}
}
}
关于SteamManager的工作原理,可参考之前链接文档中的相关模块。
涉及SDK中所有API的用法,前文链接中提供的Demo都有详细的演示,下边总结下自己主要使用的功能模块。
using UnityEngine;
using Steamworks;
public class SteamScript : MonoBehaviour {
protected Callback<GameOverlayActivated_t> m_GameOverlayActivated;
// Use this for initialization
void Start () {
if (SteamManager.Initialized)
{
string name = SteamFriends.GetPersonaName();
}
}
void OnEnable()
{
if (SteamManager.Initialized)
{
m_GameOverlayActivated = Callback<GameOverlayActivated_t>.Create(OnGameOverlayActivated);
}
}
private void OnGameOverlayActivated(GameOverlay