1. RunCallback

PC SDK의 API는 게임엔진 및 게임로직에 방해가 되지 않도록 대부분 비동기로 수행됩니다. API 호출에 대한 결과는 PC SDK 내부의 큐에 적재되며 게임이 API 호출에 대한 결과를 처리하려 할 때 RunCallback 메서드를 호출함으로써 등록한 콜백이 실행됩니다. 보통 RunCallback 메서드의 호출은 코루틴을 이용하여 작성하며 호출 주기는 설정이 가능 합니다.

private IEnumerator RunCallback(float intervalSeconds)
{
    WaitForSeconds wfs = new WaitForSeconds(intervalSeconds);
    while (true)
    {
        StovePC.RunCallback();
        yield return wfs;
    }
}

코루틴은 MonoBehaviour.StartCoroutine 메서드를 통해 시작하며 일반적으로 PC SDK 초기화가 성공하면 시작하고 PC SDK 종료가 성공하면 중지합니다.

PC SDK 종료 성공 후 RunCallback 코루틴의 중지를 위해 멤버 변수를 이용하는 방법이 있습니다.

private Coroutine runcallbackCoroutine;

게임프로젝트에 멤버변수로 선언된 **runcallbackCoroutine**을 아래 코드와 같이 **StartCoroutine**함수와 **StopCoroutine**함수를 사용해 타이머처럼 동작시킬 수 있습니다.

public void ToggleRunCallback_ValueChanged(bool isOn)
    {
        if (isOn)
        {
            float intervalSeconds = 1f;
            runcallbackCoroutine = StartCoroutine(RunCallback(intervalSeconds));

            WriteLog("RunCallback Start");
        }
        else
        {
            if (runcallbackCoroutine != null)
            {
                StopCoroutine(runcallbackCoroutine);
                runcallbackCoroutine = null;

                WriteLog("RunCallback Stop");
            }
        }
    }

2. Config, Callback 설정

PC SDK를 초기화하기 위해서는, 먼저 **StovePCConfig**와 StovePCCallback 구조체에 값을 채운 뒤, StovePC.Initialize 메서드를 호출합니다. 아래 코드를 참고하여 멤버변수를 이용하여 StovePCConfig 구조체의 각 필드 값을 채웁니다. 해당 멤버변수는 유니티 에디터의 인스펙터를 통해 값을 설정합니다.

[SerializeField]
private string env;

[SerializeField]
private string appKey;

[SerializeField]
private string appSecret;

[SerializeField]
private string gameId;

[SerializeField]
private StovePCLogLevel logLevel;

[SerializeField]
string logPath;

StovePCConfig config = new StovePCConfig
{
    Env = env,
    AppKey = appKey,
    AppSecret = appSecret,
    GameId = gameId,
    LogLevel = logLevel,
    LogPath = logPath
};

<aside> 💡 "YOUR_APP_KEY", "YOUR_SECRET_KEY", "YOUR_GAME_ID"는 스토브 스튜디오에서 발급 받은 키값으로 데이터로 변경해야 됩니다.

스토브 런처에 로그인 하지 않은 상태로 StovePC.Initialize 메서드를 호출하면 에러가 발생하니 사전에 스토브 런처를 실행하고 로그인합니다.

</aside>

<aside> 💡 주의사항

PC SDK 로그경로는 절대적경로로 설정해야 합니다. ex) C:\Program Files\{Your Game Folder}\Logs 마지막에 "\"는 추가하지 않습니다. PCSDK 에서 "StovePCSDK.log" 파일명을 자동으로 추가합니다.

만약 "" 빈문자열로 경로를 설정하게 되면 PC SDK는 자동적으로 게임실행파일 폴더 또는 PC SDK DLL 이 위치한 폴더의 경로로 로그가 생성됩니다.

게임과 PC SDK간의 연동은 C# 델리게이트(Delegate)을 사용합니다. 게임에서는 아래 StovePCCallback 클래스의 콜백에 연결할 델리게이트 메서드를 정의해야 합니다.

</aside>

public class StovePCCallback
{
    // StovePCSDK 에서 에러발생시 호출되는 콜백
    public StovePCErrorDelegate OnError;

    // PC SDK 초기화가 완료됐을 때 호출되는 콜백
    public StovePCInitializationCompleteDelegate OnInitializationComplete;

    // GetToken 처리가 완료됐을 때 호출되는 콜백
    public StovePCTokenDelegate OnToken;

    // GetUser 처리가 완료됐을 때 호출되는 콜백
    public StovePCUserDelegate OnUser;

    // GetOwnership 처리가 완료됐을 때 호출되는 콜백
    public StovePCOwnershipDelegate OnOwnership;
}

여기서 주의할 점이 있는데 StovePCCallback 객체는 PC SDK가 종료될 때까지 보존되어야 합니다. 그 이유는 StovePCCallback 객체가 가비지 컬렉팅이 되면 PC SDK 내부에서는 콜백을 호출 할 수 없기 때문입니다.

이 점을 충족시키기 위해 StovePCCallback 클래스를 게임프로젝트 클래스의 멤버변수로 선언해서 가비지 컬렉팅이 되지 않도록 하여 해결할 수 있습니다.

private StovePCCallback callback;
// StovePCCallback 클래스 instance 생성
this.callback = new StovePCCallback
{
    OnError = new StovePCErrorDelegate(this.OnError),
    OnInitializationComplete = new StovePCInitializationCompleteDelegate(this.OnInitializationComplete),
    OnToken = new StovePCTokenDelegate(this.OnToken),
    OnUser = new StovePCUserDelegate(this.OnUser),
    OnOwnership = new StovePCOwnershipDelegate(this.OnOwnership)
};

필수적으로 연동해야 하는 OnErrorOnInitializationComplete, OnOwnership 콜백함수 외의 나머지 콜백함수는 필요 시에만 연동을 하면 됩니다. 예를 들어, 소유권(Ownership) 기능만 사용하는 경우, 아래와 같이 델리게이트 메소드로 연결하면 됩니다.

/*
소유권(Ownership) 기능만 사용하는 경우는,
필수 구현 콜백인 OnError, OnInitializationComplete 외에
OnOwnership 콜백만 추가로 구현해서 연결합니다.
*/
this.callback = new StovePCCallback
{
    OnError = new StovePCErrorDelegate(this.OnError),
    OnInitializationComplete = new StovePCInitializationCompleteDelegate(this.OnInitializationComplete),
    OnOwnership = new StovePCOwnershipDelegate(this.OnOwnership)
};