프로젝트 소개
# Facepunch.Steamworks
Steamworks API를 현대적이고 사용하기 쉬운 방식으로 감싸기 위해 설계된 또 다른 C# Steamworks 구현입니다. Steam 자체 외에 네이티브 종속성이 없는 단일 C# DLL을 목표로 하며, Windows, Linux, MacOS 및 Unity와 IL2CPP를 지원합니다.
## 기능
- 크로스 플랫폼: Windows, Linux, MacOS
- Unity 지원 (IL2CPP 포함)
- 비동기 콜백(Steam callresults) 및 이벤트(Steam callbacks)
- 단일 C# DLL, 타사 네이티브 DLL 불필요
- MIT 라이선스의 오픈 소스
- 32비트 운영 체제 지원
## 이 라이브러리를 사용하는 이유
저자는 기존 C# Steamworks 구현이 부족하다고 생각했습니다. 진정한 C# 관용적 방식이 아니거나, 오래되었거나, 네이티브 DLL이 필요하거나, Unity에서 독립 DLL로 컴파일할 수 없거나, 무료가 아니거나, 제한적인 라이선스를 가졌기 때문입니다. 이 라이브러리는 Steamworks API를 더 쉽게 사용할 수 있도록 감싸는 것을 목표로 합니다.
## 사용 예제
### 사용자 정보 가져오기
```csharp
SteamClient.SteamId // 사용자의 SteamId
SteamClient.Name // 사용자의 이름
```
### 친구 목록
```csharp
foreach ( var friend in SteamFriends.GetFriends() )
{
Console.WriteLine( $"{friend.Id}: {friend.Name}" );
Console.WriteLine( $"{friend.IsOnline} / {friend.SteamLevel}" );
friend.SendMessage( "Hello Friend" );
}
```
### 앱 정보
```csharp
Console.WriteLine( SteamApps.GameLanguage );
var installDir = SteamApps.AppInstallDir( 4000 );
var fileinfo = await SteamApps.GetFileDetailsAsync( "hl2.exe" );
```
### 아바타
```csharp
var image = await SteamFriends.GetLargeAvatarAsync( steamid );
if ( !image.HasValue ) return DefaultImage;
return MakeTextureFromRGBA( image.Value.Data, image.Value.Width, image.Value.Height );
```
### 서버 목록
```csharp
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}" );
}
}
```
### 도전 과제
도전 과제 나열 및 잠금 해제:
```csharp
foreach ( var a in SteamUserStats.Achievements )
{
Console.WriteLine( $"{a.Name} ({a.State})" );
}
var ach = new Achievement( "GM_PLAYED_WITH_GARRY" );
ach.Trigger();
```
### 음성
```csharp
SteamUser.VoiceRecord = KeyDown( "V" );
if ( SteamUser.HasVoiceData )
{
var bytesrwritten = SteamUser.ReadVoiceData( stream );
}
```
### 인증
클라이언트 및 서버 인증:
```csharp
var ticket = SteamUser.GetAuthSessionTicket();
SteamServer.OnValidateAuthTicketResponse += ( steamid, ownerid, rsponse ) =>
{
if ( rsponse == AuthResponse.OK )
TellUserTheyCanBeOnServer( steamid );
else
KickUser( steamid );
};
if ( !SteamServer.BeginAuthSession( ticketData, clientSteamId ) )
{
KickUser( clientSteamId );
}
ticket.Cancel();
```
### 유틸리티
```csharp
SteamUtils.SecondsSinceAppActive;
SteamUtils.SecondsSinceComputerActive;
SteamUtils.IpCountry;
SteamUtils.UsingBatteryPower;
SteamUtils.CurrentBatteryPower;
SteamUtils.AppId;
SteamUtils.IsOverlayEnabled;
SteamUtils.IsSteamRunningInVR;
SteamUtils.IsSteamInBigPictureMode;
```
### 워크샵
워크샵 아이템 다운로드, 조회 및 게시:
```csharp
SteamUGC.Download( 1717844711 );
var itemInfo = await Ugc.Item.Get( 1720164672 );
var q = Ugc.Query.All
.WithTag( "Fun" )
.WithTag( "Movie" )
.MatchAllTags();
var result = await q.GetPageAsync( 1 );
var q = Ugc.UserQuery.All.CreatedByFriends();
var q = Ugc.UserQuery.All.FromSelf();
var result = await Ugc.Editor.NewCommunityFile
.WithTitle( "My New FIle" )
.WithDescription( "This is a description" )
.WithContent( "c:/folder/addon/location" )
.WithTag( "awesome" )
.WithTag( "small" )
.SubmitAsync( iProgressBar );
```
### Steam Cloud
```csharp
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 인벤토리
```csharp
foreach ( InventoryDef def in SteamInventory.Definitions )
{
Console.WriteLine( $"{def.Name}" );
}
var defs = await SteamInventory.GetDefinitionsWithPricesAsync();
var result = await SteamInventory.GetItems();
using ( result )
{
var items = result?.GetItems( bWithProperties );
foreach ( InventoryItem item in items )
{
Console.WriteLine( $"{item.Id} / {item.Quantity} / {item.Def.Name} " );
}
}
```
## 시작하기
### 클라이언트 초기화
```csharp
using Steamworks;
try
{
SteamClient.Init( 4000 );
}
catch ( System.Exception e )
{
// 어떤 이유로 초기화할 수 없음 (Steam이 꺼져 있는 등)
}
// 완료 시:
SteamClient.Shutdown();
```
### 서버 초기화
```csharp
var serverInit = new SteamServerInit( "gmod", "Garry Mode" )
{
GamePort = 28015,
Secure = true,
QueryPort = 28016
};
try
{
Steamworks.SteamServer.Init( 4000, serverInit );
}
catch ( System.Exception )
{
// 어떤 이유로 초기화할 수 없음 (DLL 오류, 포트 차단)
}
```
## 도움말 및 기여
풀 리퀘스트와 버그 보고를 통한 기여를 환영합니다. 도움말과 토론은 [Steamworks 스레드](http://steamcommunity.com/groups/steamworks/discussions/0/1319961618833314524/)를 방문하세요. 예제와 조언이 있는 [위키](https://wiki.facepunch.com/steamworks/)도 있습니다.
## 라이선스
MIT - 원하는 대로 사용하세요.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.