Facepunch.Steamworks
功能
功能 | 支持 |
---|---|
Windows | ✔ |
Linux | ✔ |
MacOS | ✔ |
Unity支持 | ✔ |
Unity IL2CPP支持 | ✔ |
异步回调(steam callresults) | ✔ |
事件(steam callbacks) | ✔ |
单个C# dll(除Steam外无需其他本地依赖) | ✔ |
开源 | ✔ |
MIT许可证 | ✔ |
任何32位操作系统 | ✔ |
为什么
我发现的与Unity兼容的Steamworks C#实现已经运行了很长时间。但我讨厌它们所有。原因有很多。
- 它们不是C#,只是一堆函数的集合。
- 它们不是最新的。
- 它们需要第三方本地dll。
- 它们无法编译成独立的dll(在Unity中)。
- 它们不是免费的。
- 它们的许可证限制性很强。
C#的目的是让事情变得更简单。所以让我们尝试以一种更简单的方式来封装它。
什么
获取你自己的信息
SteamClient.SteamId // 你的SteamId
SteamClient.Name // 你的名字
查看你的好友列表
foreach ( var friend in SteamFriends.GetFriends() )
{
Console.WriteLine( $"{friend.Id}: {friend.Name}" );
Console.WriteLine( $"{friend.IsOnline} / {friend.SteamLevel}" );
friend.SendMessage( "你好,朋友" );
}
应用信息
Console.WriteLine( SteamApps.GameLanguage ); // 打印当前游戏语言
var installDir = SteamApps.AppInstallDir( 4000 ); // 获取Garry's Mod的安装文件夹路径
var fileinfo = await SteamApps.GetFileDetailsAsync( "hl2.exe" ); // 异步获取文件详情
DoSomething( fileinfo.SizeInBytes, fileinfo.Sha1 );
获取头像
var image = await SteamFriends.GetLargeAvatarAsync( steamid );
if ( !image.HasValue ) return DefaultImage;
return MakeTextureFromRGBA( image.Value.Data, image.Value.Width, image.Value.Height );
获取服务器列表
using ( var list = new ServerList.Internet() )
{
list.AddFilter( "map", "de_dust" );
await list.RunQueryAsync();
foreach ( var server in list.Responsive )
{
Console.WriteLine( $"{server.Address} {server.Name}" );
}
}
成就
列出成就
foreach ( var a in SteamUserStats.Achievements )
{
Console.WriteLine( $"{a.Name} ({a.State})" );
}
解锁成就
var ach = new Achievement( "GM_PLAYED_WITH_GARRY" );
ach.Trigger();
语音
SteamUser.VoiceRecord = KeyDown( "V" );
if ( SteamUser.HasVoiceData )
{
var bytesrwritten = SteamUser.ReadVoiceData( stream );
// 将数据流发送到服务器或其他地方
}
身份验证
// 客户端以某种方式将票据数据发送到服务器
var ticket = SteamUser.GetAuthSessionTicket();
// 服务器监听事件
SteamServer.OnValidateAuthTicketResponse += ( steamid, ownerid, rsponse ) =>
{
if ( rsponse == AuthResponse.OK )
TellUserTheyCanBeOnServer( steamid );
else
KickUser( steamid );
};
// 服务器从客户端获取票据数据,调用此函数..它要么立即返回false,要么发出TicketResponse。
if ( !SteamServer.BeginAuthSession( ticketData, clientSteamId ) )
{
KickUser( clientSteamId );
}
//
// 客户端离开时取消他们的票据,服务器上再次调用OnValidateAuth
// 这次返回AuthResponse.AuthTicketCanceled
//
ticket.Cancel();
实用工具
SteamUtils.SecondsSinceAppActive;
SteamUtils.SecondsSinceComputerActive;
SteamUtils.IpCountry;
SteamUtils.UsingBatteryPower;
SteamUtils.CurrentBatteryPower;
SteamUtils.AppId;
SteamUtils.IsOverlayEnabled;
SteamUtils.IsSteamRunningInVR;
SteamUtils.IsSteamInBigPictureMode;
创意工坊
通过ID下载创意工坊物品
SteamUGC.Download( 1717844711 );
获取创意工坊物品信息
var itemInfo = await Ugc.Item.Get( 1720164672 );
Console.WriteLine( $"标题: {itemInfo?.Title}" );
Console.WriteLine( $"是否已安装: {itemInfo?.IsInstalled}" );
Console.WriteLine( $"是否正在下载: {itemInfo?.IsDownloading}" );
Console.WriteLine( $"是否等待下载: {itemInfo?.IsDownloadPending}" );
Console.WriteLine( $"是否已订阅: {itemInfo?.IsSubscribed}" );
Console.WriteLine( $"是否需要更新: {itemInfo?.NeedsUpdate}" );
Console.WriteLine( $"描述: {itemInfo?.Description}" );
查询创意工坊物品列表
var q = Ugc.Query.All
.WithTag( "有趣" )
.WithTag( "电影" )
.MatchAllTags();
var result = await q.GetPageAsync( 1 );
Console.WriteLine( $"结果数量: {result?.ResultCount}" );
Console.WriteLine( $"总数: {result?.TotalCount}" );
foreach ( Ugc.Item entry in result.Value.Entries )
{
Console.WriteLine( $"{entry.Title}" );
}
查询好友创建的物品
var q = Ugc.UserQuery.All
.CreatedByFriends();
查询自己创建的物品
var q = Ugc.UserQuery.All
.FromSelf();
发布自己的文件
var result = await Ugc.Editor.NewCommunityFile
.WithTitle( "我的新文件" )
.WithDescription( "这是一个描述" )
.WithContent( "c:/folder/addon/location" )
.WithTag( "很棒" )
.WithTag( "小巧" )
.SubmitAsync( iProgressBar );
Steam云存储
写入云文件
SteamRemoteStorage.FileWrite( "file.txt", fileContents );
读取云文件
var fileContents = SteamRemoteStorage.FileRead( "file.txt" );
列出所有文件
foreach ( var file in SteamRemoteStorage.Files )
{
Console.WriteLine( $"{file} ({SteamRemoteStorage.FileSize(file)} {SteamRemoteStorage.FileTime( file )})" );
}
Steam物品库
获取物品定义
foreach ( InventoryDef def in SteamInventory.Definitions )
{
Console.WriteLine( $"{def.Name}" );
}
获取物品商店中正在销售的物品
var defs = await SteamInventory.GetDefinitionsWithPricesAsync();
foreach ( var def in defs )
{
Console.WriteLine( $"{def.Name} [{def.LocalPriceFormatted}]" );
}
获取你的物品列表
var result = await SteamInventory.GetItems();
// result是可释放的,良好的习惯是在使用后释放
using ( result )
{
var items = result?.GetItems( bWithProperties );
foreach ( InventoryItem item in items )
{
Console.WriteLine( $"{item.Id} / {item.Quantity} / {item.Def.Name} " );
}
}
入门指南
客户端
要初始化客户端,你可以这样做:
using Steamworks;
// ...
try
{
SteamClient.Init( 4000 );
}
catch ( System.Exception e )
{
// 无法初始化的原因(Steam已关闭等)
}
将4000替换为你游戏的appid。在初始化之前不应调用任何Steam函数。
当你完成后,在关闭游戏时,只需关闭即可。
SteamClient.Shutdown();
服务器
要创建服务器,请这样做:
var serverInit = new SteamServerInit( "gmod", "Garry模式" )
{
GamePort = 28015,
Secure = true,
QueryPort = 28016
};
try
{
Steamworks.SteamServer.Init( 4000, serverInit );
}
catch ( System.Exception )
{
// 无法初始化的原因(dll错误,端口被阻止)
}
帮助
想帮忙吗?那就来吧,欢迎提交拉取请求、错误报告,是的,尽管去做。
你也可以访问Steamworks讨论帖寻求帮助/讨论。
我们还有一个wiki供你阅读,你可以帮助填写示例和建议。
许可证
MIT - 你可以随意使用。