프로젝트 소개

# 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 - 원하는 대로 사용하세요.