05
16

⚠️이 글은 API 문서를 보면서 공부한 내용 정리한겁니다.

 

https://kb.heathen.group/assets/steamworks/unity-engine/components/steamworks-behaviour

 

썸네일

공부하실 때 유니티로 Steamworks Behavior 열어서 API문서와 비교하면 더 좋습니다.


1. Steamworks Behavior란?

 

Steamworks Behavior는 Steam API를 초기화하고 Unity Inspector에 공통 이벤트를 노출합니다.

버전 2.30.12부터 Steamworks Behavior는 더 이상 콜백 루프를 실행하지 않습니다.

구성 요소 스크립트를 사용하지 않고 Steam API를 초기화하고 실행할 수 있도록 만들었습니다.

즉, 사용할 때 Bootstrap Scene에서 Steamworks Behavior를 사용하면 큰 이점을 얻을 수 있습니다.

 

⚠️Bootstrap Scene이 뭐임? ↓

더보기

Bootstrap Scene은 엔진 초기화, 리소스 로딩, 게임 상태 설정 등과 같은 전반적인 준비 작업을 처리합니다. 

이 씬은 보통 게임이나 앱이 시작될 때 가장 먼저 로드되며, 초기화된 후에는 메인 씬이나 다른 씬으로 전환됩니다.

 

보통 게임 킬 때 인트로 화면(Splash 화면)이 Bootstrap Scene 역할을 담당합니다.

다만 게임 빨리 켜지는걸 원하는 사용자에게는 티안나게 작업을 처리해야합니다. 

 

유니티 Bootstrap 씬 구현

 

유니티 Bootstrap 씬 구현

⚠️아랫분의 강좌에서 공부해서 정리한 글입니다. ↓ https://github.com/GameDevEducation/DevToolkit_BootstrappedScenes/tree/master/Assets/Scripts https://www.youtube.com/watch?v=hcUX-VdUnb8 Bootstrap 씬은 말 그대로 부팅할 때

kimyir.tistory.com

위의 글에서 Bootstrap Scene을 만든 뒤, 에러가 난다면 종료하는 처리해주면된다,

 

아래는 코드 예제다. ↓

public class Bootstrapper : MonoBehaviour
{
  public ErrorController errorController;
  public LoadingScreenController loadingScreen;

  void Start()
  {
    GameSettings.MainCamera = Camera.Main;
    GameSettings.ErrorController = errorController;
    GameSettings.LoadingScreen = loadingScreen;
    // ... whever ever else you have
  }

  void Update()
  {
    if(SteamSettings.HasInitalizationError)
    {
        errorController.ReportError("An error occured while initalizing Steam API, " 
        + "this is a required system and so the game must close. "
        + "If this persists please contact technical support."
        + "\n\nError Message: "
        + SteamSettings.InitalizationErrorMessage);
        Application.Quit();
    }
    else if (SteamSettings.Initialized)
    {
        //All is well so load the title scene
        StartCoroutine(LoadTitle());
    }
  }

  IEnumerator LoadTitle()
  {
    //This should load the title scene async and update UI to reflect status
    //This should handle any error in loading the title scene, 
    //report it to the user if it happens and close the app nicely
  }
}

 


2. 어떻게 쓰는건데?

 

우선 게임에서 로드할 제일 첫 번째 Scene의 GameObject에 Steamworks Behavior 스크립트를 붙혀야합니다. 

이 GameObject는 Steam API 통합을 작동하는 동안 절대 파괴되지 않는 것이 중요합니다. 

 

때문에 로딩을 더 길게 만드는게 좋아서 아예 로딩씬(Loading Scene)을 만드는게 좋습니다.

로딩으로 시간을 끌면 Bootstrap Scene을 완전히 다 로드한 후 다음 씬을 로드할 수 있습니다.

그리고 다음 씬에서는 Bootstrap Scene을 언로드하지 않고 유지합니다.

Bootstrap Scene을 유지함으로써 게임 전반에서 필요한 설정을 계속 유지할 수 있으며,

게임의 성능을 최적화할 수 있습니다.

 

간단하게 말해서 Bootstrap Scene을 언로드하지 않는 것이 좋습니다. 

만약 그래도 삭제될까 무섭다 하시면 DontDestroyOnLoad 접근방식을 이용하면됩니다.

어쨋든 Steamworks Behaviour을 정의한 Scene을 중복 로드하지 말고 삭제 안되게 유지하세요. 

 

Steamworks Behaviour은 UnityEvents에 따라 Steam API 통합을 초기화, 작동 및 종료하기 위해 존재합니다.

한 가지 예외가 있는데 API 초기화를 지연해야 하는 상황에서 Steam 게임 서버를 운영하는 경우입니다.

이 경우 개발자가 Steam 게임 서버를 자동으로 초기화하지 않도록 Steam 설정을 구성할 수 있습니다.

만약 수동으로 초기화 프로세스를 시작하려면 SteamworksBehaviour.InitializeGameServer를 호출해야 합니다.

 

근데 자동으로 초기화하는게 일반적입니다.

수동으로 초기화 실행 예시 ↓

steamworksBeahviour.InitalizeGameServer();

 


3. Events 사용법

 

스팀 초기화 Event

public UnityEvent evtSteamInitialized = new UnityEvent();

한번 Steamworks Behaviour를 유니티에서 스크립트 열어서 코드를 봅시다.

코드를 보면 Steam API가 완전히 초기화되고 모든 아티팩트를 사용할 준비가 되면 호출됩니다.

 

이 이벤트에는 매개변수가 없으며 이 이벤트에 대한 핸들러는 다음과 같습니다.

public void HandleEvent()
{
    //할꺼 여기다가
}

문서 설명이 부실한데 유니티에서 직접 코드를 보니 그냥 일반적인 UnityEvent의 헨들러와 똑같다.

원하는거 AddListener(헨들러 함수()) 이런식으로 넣어주면 된다는 말이다.

 


4. Evt Steam 초기화 오류

 

┌스팀 초기화 오류 발생시 Event

public UnityStringEvent evtSteamInitializationError = new UnityStringEvent();

Steam API가 초기화에 실패하면 호출됩니다. 

이 이벤트에는 초기화에 실패한 이유를 나타내는 메시지인 문자열 유형의 매개변수 1개가 있습니다. 

 

이 이벤트에 대한 핸들러는 다음과 같습니다.

public void HandleEvent(string errorMessage)
{
    //함수 내용
}

코드를 보니 초기화 실패 하면 위의 헨들러같은걸 실행해서 Debug.LogError(errorMessage);로 디버깅한다.

따라서 헨들러 만들 때 string 매개변수가 무조건 있다.

 


5. 이벤트 로비 초대 인수 감지됨

 

public LobbyDataEvent evtLobbyInviteArgumentDetected = new LobbyDataEvent();

로비 ID가 헨들러 인수에 전달되었음을 시스템이 감지한 경우 초기화가 완료된 후 호출됩니다. 

사용자가 로비 초대를 수락했지만 현재 게임을 플레이하고 있지 않은 경우에 발생합니다. 

여기서 Steam은 command line의 로비 ID로 게임을 시작합니다.

 

이 이벤트에는 command line 인수에 전달된 로비인 Lobby 유형의 인수가 1개 있으며 다음과 같은 핸들러가 있습니다.

public void HandleEvent(Lobby lobby)
{
    //DO WORK
}

 

 

Lobby 문서 ↓

https://kb.heathen.group/assets/steamworks/data-layer/lobby-data

 


6. 필드 속성과 함수(메서드)

 

Steamworks Behaviour에 보면 이런 필드 속성이 있습니다.

public SteamSettings settings;

이건 API를 초기화할 때 사용해야 하는 SteamSettings입니다.

SteamSettings는 Scriptable Object로 되어있어 에디터에서 수정해서 넣어주면됩니다.

 

SteamSettings 문서 ↓

https://kb.heathen.group/assets/steamworks/unity-engine/scriptable-objects/steam-settings

 

 

Steamworks Behaviour에 보면 요런 메서드가 스크립트에 있습니다.

public static void CreateIfMissing(SteamSettings settings, bool doNotDestroy = false)

필요할 때 안전하게 Steamworks Behavior를 생성하는 데 사용할 수 있는 정적 메서드입니다. 

이렇게 하는 것은 권장되지 않습니다. 개발 시 Steamworks 동작이 설정되는 Bootstrap Scene을 사용해야 합니다.

 

"늦은 초기화" 접근 방식을 선택하거나 단순히 사용해야 하는 경우 이 방법을 사용하여 

Steamworks 동작을 안전하게 생성하고 선택적으로 파괴 금지로 표시할 수 있습니다. 

Steamworks 동작이 이미 존재하는 경우 아무 것도 생성하지 않습니다.

COMMENT