Steamworks.NET (github)
- Steamworks API를 위한 C# 래퍼
- Unity 및 기타 .NET 프로젝트에서 사용
- Steam 플랫폼의 다양한 기능 제공
- Steamworks SDK 1.60 기반
문서
https://steamworks.github.io/최신 버전
2024.8.0
.unitypackage 파일 다운로드 후 임포트 (링크)‼️ 설치 후에 프로젝트의 루트 폴더 >
steam_appid.txt파일의 숫자를 본인이 스팀웍스 등록할 때 받은 AppId로 바꿔야 함설치 후 steam_appid.txt 파일을 프로젝트 루트에 생성하고 AppId를 입력해야 합니다. (ASCII 또는 UTF-8 BOM 없음으로 저장). SteamManager MonoBehavior를 다운로드하여 시작점으로 사용할 수 있습니다.
SteamManager 활용
SteamManager 스크립트를 사용하여 초기화를 간소화하고, 게임 시작 시 Steam이 정상적으로 작동하는지 확인합니다.
SteamAPI 호출
SteamFriends.GetPersonaName()과 같은 간단한 SteamAPI 메소드를 호출하여 Steamworks.NET이 제대로 설정되었는지 테스트합니다.
콜백(Callbacks)
Steam Overlay 활성화와 같은 비동기 이벤트에 대한 응답을 처리하기 위해 콜백을 사용하는 방법을 설명합니다.
Callback<>을 선언하고, OnEnable()에서 생성하고, 이벤트 발생 시 실행될 함수를 정의합니다.
콜결과(CallResults)
특정 함수 호출의 비동기 결과를 처리하기 위해 콜결과를 사용하는 방법을 설명합니다.
CallResult<>를 선언하고, OnEnable()에서 생성하고, 결과를 처리할 함수를 정의합니다.
SteamAPICall_t 핸들을 콜결과와 연결해야 합니다.
SteamAPI.RunCallbacks
콜백과 콜결과를 처리하려면 SteamAPI.RunCallbacks를 정기적으로 호출해야 합니다.
SteamManager에서 이 작업을 수행합니다.
예제 프로젝트 활용
Steamworks.NET-Test 및 Steamworks.NET-GameServerTest 프로젝트를 참고하여 Steamworks 기능을 구현하는 방법을 학습합니다.
Valve 문서 참고
Valve의 Steamworks API 문서도 함께 참고하는 것이 좋습니다.
| 설명 | API 함수 |
|---|---|
| Steam 계정을 통한 로그인 및 인증 | SteamUser.GetAuthSessionTicket() |
| 로그인한 사용자 정보 가져오기 | SteamUser.GetSteamID() |
| 사용자 로그인 상태 확인 | SteamUser.BLoggedOn() |
| 설명 | API 함수 |
|---|---|
| Steam Lobby 시스템 | SteamMatchmaking.CreateLobby() |
| Steam P2P 네트워킹 | SteamNetworking.SendP2PPacket() |
| 친구 기반 매치메이킹 지원 | SteamMatchmaking.InviteUserToLobby() |
| 설명 | API 함수 |
|---|---|
| 성과 달성 및 저장 | SteamUserStats.SetAchievement() |
| 성과 달성 여부 확인 | SteamUserStats.GetAchievement() |
| 리더보드 점수 등록 및 조회 | SteamUserStats.UploadLeaderboardScore() |
| 설명 | API 함수 |
|---|---|
| Steam Cloud를 통한 게임 데이터 저장 | SteamRemoteStorage.FileWrite() |
| 클라우드에서 데이터 불러오기 | SteamRemoteStorage.FileRead() |
| 저장된 파일 목록 조회 | SteamRemoteStorage.GetFileCount() |
| 설명 | API 함수 |
|---|---|
| Steam 인벤토리 시스템 관리 | ISteamInventory 인터페이스의 다양한 함수들 |
| 게임 내 아이템 생성 및 할당 | ISteamInventory.GenerateItems() |
| 아이템 교환 및 거래 | ISteamInventory.TransferItemQuantity() |
| 플레이어의 인벤토리 조회 | ISteamInventory.GetAllItems() |
| 설명 | API 함수 |
|---|---|
| Steam 친구 목록 조회 | SteamFriends.GetFriendCount() |
| 특정 친구의 닉네임 가져오기 | SteamFriends.GetFriendPersonaName() |
| Steam Overlay 활성화 | SteamFriends.ActivateGameOverlay() |
| 설명 | API 함수 |
|---|---|
| 플레이어 게임 내 데이터 저장 | SteamUserStats.SetStat() |
| 게임 내 통계 데이터 조회 | SteamUserStats.GetStat() |
| 플레이어 진행도 저장 | SteamUserStats.StoreStats() |
| 설명 | API 함수 |
|---|---|
| 게임 보안 인증 | SteamUser.GetAuthSessionTicket() |
| VAC(Valve Anti-Cheat) 상태 확인 | SteamUser.BIsVACBanned() |
| 두 단계 인증 상태 확인 | SteamUser.BIsTwoFactorEnabled() |
private static SteamManager s_instance;
private static SteamManager Instance {
get {
if (s_instance == null) {
return new GameObject("SteamManager").AddComponent<SteamManager>();
}
else {
return s_instance;
}
}
}
이 코드는 싱글톤 패턴을 구현합니다.
s_instance는 SteamManager의 유일한 인스턴스를 저장합니다.Instance 프로퍼티는 이 인스턴스에 접근하는 방법을 제공합니다.private void Awake() {
// 싱글톤 인스턴스 체크
if (s_instance != null) {
Destroy(gameObject);
return;
}
s_instance = this;
// Steamworks.NET 버전 체크
if (!Packsize.Test()) {
Debug.LogError("[Steamworks.NET] Packsize Test 실패. Steam_api.dll 버전이 잘못되었습니다.");
}
if (!DllCheck.Test()) {
Debug.LogError("[Steamworks.NET] DllCheck Test 실패. Steam_api.dll을 업데이트 해주세요.");
}
// Steam 클라이언트 실행 체크
try {
if (SteamAPI.RestartAppIfNecessary((AppId_t)480)) {
Application.Quit();
return;
}
}
catch (System.DllNotFoundException e) {
Debug.LogError("[Steamworks.NET] steam_api.dll을 찾을 수 없습니다. Steam이 설치되어 있는지 확인하세요.");
}
// Steam API 초기화
if (!SteamAPI.Init()) {
Debug.LogError("[Steamworks.NET] SteamAPI.Init() 실패");
return;
}
m_bInitialized = true;
}
이 Awake 메서드는 다음 작업을 수행합니다:
SteamAPI.Init()을 호출하여 Steam API를 초기화합니다.private void Update() {
if (!m_bInitialized) {
return;
}
SteamAPI.RunCallbacks();
}
이 Update 메서드는 매 프레임마다 실행됩니다:
m_bInitialized가 true일 때만 실행됩니다 (Steam API가 성공적으로 초기화된 경우).SteamAPI.RunCallbacks()를 호출하여 Steam으로부터의 콜백을 처리합니다.private void OnDestroy() {
if (s_instance != this) {
return;
}
s_instance = null;
if (!m_bInitialized) {
return;
}
SteamAPI.Shutdown();
}
이 OnDestroy 메서드는 게임 오브젝트가 파괴될 때 호출됩니다:
SteamAPI.Shutdown()을 호출하여 Steam API를 정리합니다.이 SteamManager 스크립트는 Unity 프로젝트에서 Steam API를 안전하고 효율적으로 사용할 수 있는 기반을 제공합니다. 개발자는 이 스크립트를 기반으로 필요한 Steam 기능(예: 업적, 리더보드, 친구 목록 등)을 추가로 구현할 수 있습니다.