[ETC] Steam API

은개·2025년 2월 28일
post-thumbnail

1️⃣ 개요

Steamworks.NET (github)

  • Steamworks API를 위한 C# 래퍼
  • Unity 및 기타 .NET 프로젝트에서 사용
  • Steam 플랫폼의 다양한 기능 제공
  • Steamworks SDK 1.60 기반

문서
https://steamworks.github.io/

최신 버전
2024.8.0

⚙️ 설치

Unity 사용

  • .unitypackage 파일 다운로드 후 임포트 (링크)
  • Unity Package Manager를 통해 Git URL로 설치 (최신 버전 또는 특정 버전 지정 가능)
  • 수동 설치
    : GitHub에서 직접 다운로드 후 com.rlabrecque.steamworks.net 폴더를 Assets/ 폴더에 복사

    ‼️ 설치 후에 프로젝트의 루트 폴더 > 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-TestSteamworks.NET-GameServerTest 프로젝트를 참고하여 Steamworks 기능을 구현하는 방법을 학습합니다.

  • Valve 문서 참고
    Valve의 Steamworks API 문서도 함께 참고하는 것이 좋습니다.



2️⃣ 주요 기능

1. 사용자 인증 및 로그인 (Authentication)

설명API 함수
Steam 계정을 통한 로그인 및 인증SteamUser.GetAuthSessionTicket()
로그인한 사용자 정보 가져오기SteamUser.GetSteamID()
사용자 로그인 상태 확인SteamUser.BLoggedOn()

2. 멀티플레이 및 매치메이킹 (Multiplayer & Matchmaking)

설명API 함수
Steam Lobby 시스템SteamMatchmaking.CreateLobby()
Steam P2P 네트워킹SteamNetworking.SendP2PPacket()
친구 기반 매치메이킹 지원SteamMatchmaking.InviteUserToLobby()

3. 성과 및 리더보드 (Achievements & Leaderboards)

설명API 함수
성과 달성 및 저장SteamUserStats.SetAchievement()
성과 달성 여부 확인SteamUserStats.GetAchievement()
리더보드 점수 등록 및 조회SteamUserStats.UploadLeaderboardScore()

4. 저장 및 클라우드 (Storage & Cloud)

설명API 함수
Steam Cloud를 통한 게임 데이터 저장SteamRemoteStorage.FileWrite()
클라우드에서 데이터 불러오기SteamRemoteStorage.FileRead()
저장된 파일 목록 조회SteamRemoteStorage.GetFileCount()

5. 경제 및 상점 기능 (Economy & Store)

설명API 함수
Steam 인벤토리 시스템 관리ISteamInventory 인터페이스의 다양한 함수들
게임 내 아이템 생성 및 할당ISteamInventory.GenerateItems()
아이템 교환 및 거래ISteamInventory.TransferItemQuantity()
플레이어의 인벤토리 조회ISteamInventory.GetAllItems()

6. 소셜 기능 (Friends & Community)

설명API 함수
Steam 친구 목록 조회SteamFriends.GetFriendCount()
특정 친구의 닉네임 가져오기SteamFriends.GetFriendPersonaName()
Steam Overlay 활성화SteamFriends.ActivateGameOverlay()

7. 게임 통계 및 데이터 분석 (Game Stats & Analytics)

설명API 함수
플레이어 게임 내 데이터 저장SteamUserStats.SetStat()
게임 내 통계 데이터 조회SteamUserStats.GetStat()
플레이어 진행도 저장SteamUserStats.StoreStats()

8. 보안 및 안티치트 (Security & Anti-Cheat)

설명API 함수
게임 보안 인증SteamUser.GetAuthSessionTicket()
VAC(Valve Anti-Cheat) 상태 확인SteamUser.BIsVACBanned()
두 단계 인증 상태 확인SteamUser.BIsTwoFactorEnabled()


3️⃣ SteamManager Script 작성하기

1. 싱글톤 패턴 구현

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 프로퍼티는 이 인스턴스에 접근하는 방법을 제공합니다.
  • 만약 인스턴스가 없다면 새로 생성하고, 있다면 기존 인스턴스를 반환합니다.
  • 이를 통해 게임 전체에서 하나의 SteamManager만 존재하도록 보장합니다.

2. 초기화 및 안전 점검

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 메서드는 다음 작업을 수행합니다:

  1. 싱글톤 인스턴스 체크: 중복 인스턴스 생성을 방지합니다.
  2. Steamworks.NET 버전 체크: 올바른 버전의 Steam API DLL이 사용되고 있는지 확인합니다.
  3. Steam 클라이언트 실행 체크: Steam이 실행 중인지 확인하고, 필요하면 재시작합니다.
  4. Steam API 초기화: SteamAPI.Init()을 호출하여 Steam API를 초기화합니다.

3. 콜백 처리

private void Update() {
    if (!m_bInitialized) {
        return;
    }
    SteamAPI.RunCallbacks();
}

Update 메서드는 매 프레임마다 실행됩니다:

  • m_bInitialized가 true일 때만 실행됩니다 (Steam API가 성공적으로 초기화된 경우).
  • SteamAPI.RunCallbacks()를 호출하여 Steam으로부터의 콜백을 처리합니다.
  • 이를 통해 Steam 이벤트(예: 친구 온라인 상태 변경, 업적 달성 등)에 실시간으로 반응할 수 있습니다.

4. 종료 처리

private void OnDestroy() {
    if (s_instance != this) {
        return;
    }

    s_instance = null;

    if (!m_bInitialized) {
        return;
    }

    SteamAPI.Shutdown();
}

OnDestroy 메서드는 게임 오브젝트가 파괴될 때 호출됩니다:

  • 현재 인스턴스가 싱글톤 인스턴스인지 확인합니다.
  • Steam API가 초기화되었는지 확인합니다.
  • SteamAPI.Shutdown()을 호출하여 Steam API를 정리합니다.
  • 이를 통해 게임 종료 시 Steam 리소스를 적절히 해제합니다.

이 SteamManager 스크립트는 Unity 프로젝트에서 Steam API를 안전하고 효율적으로 사용할 수 있는 기반을 제공합니다. 개발자는 이 스크립트를 기반으로 필요한 Steam 기능(예: 업적, 리더보드, 친구 목록 등)을 추가로 구현할 수 있습니다.


4️⃣ 기능별 함수

0개의 댓글