Skip to content
스토브
마지막 업데이트

스토브링크

이해하기


스토브링크는 PC에서 플레이 중인 게임을 모바일 기기로 실시간 스트리밍해 원격으로 플레이하는 서비스예요.
실시간 렌더링된 게임 화면과 오디오를 재생하고, 모바일에서 발생하는 키보드·마우스·터치 이벤트를 PC로 전송해 게임을 직접 제어해요.

STOVE Link SDK를 통해 원격 스트리밍 기능을 게임에 손쉽게 통합할 수 있고,
플레이어는 PC를 켜둔 상태에서 모바일 기기로 매끄러운 게임 경험을 이어갈 수 있어요.



주요 특징

스토브링크는 단순한 화면 전송이 아니라 게임 플레이를 위한 양방향 통신과 보안 기능을 함께 제공해요.

특징 설명
고품질 원격 플레이 최대 1080p / 60fps 해상도와 end-to-end 150ms 이하의 저지연 스트리밍을 지원.
양방향 입력 모바일에서 발생한 터치·가상 컨트롤러·가상 키보드 입력을 PC 게임으로 실시간 전송.
게임 이벤트 알림 게임에서 발생하는 주요 이벤트(아이템 획득, HP 부족 등)를 모바일 푸시로 전송.

  [원격 플레이]

  [이벤트 알림]



구성 요소

스토브링크는 PC와 모바일, 그리고 스트리밍을 중계하는 스토브 서버 인프라로 구성돼요.

구성 역할
스토브 PC 클라이언트 게임을 실행하고 스트리밍 모드를 ON/OFF 하는 PC 측 진입점.
스토브 앱 모바일 측 진입점. 스트리밍 화면을 표시하고 이용자 입력을 PC로 전송.
스토브 서버 인프라 Signaling / Matchmaker / TURN·STUN 서버로 PC와 모바일 사이의 WebRTC 연결을 중계.



시스템 구성 요소

SDK 내부에서 동작하는 시스템 구성 요소는 4개로 나뉘어요.
이 구성은 게임 코드에 직접 노출되지는 않지만, 연동 흐름을 이해하는 데 도움이 돼요.

구성 요소 역할
Streaming SDK 플러그인 Unreal·Unity 엔진에 임베드되어 게임 프레임을 인코딩하고 입력 이벤트를 수신.
Signaling Server PC와 모바일 사이의 WebRTC Offer/Answer·ICE Candidate 교환을 중계.
Matchmaker Server 스트리밍 가능한 PC 세션을 등록하고 모바일 요청과 매칭.
TURN / STUN Server NAT 환경에서도 P2P 연결이 가능하도록 미디어 트래픽을 중계.



엔진별 기능 지원

스토브링크는 Unreal Engine과 Unity Engine을 모두 지원해요.
엔진별로 사용 가능한 LinkSDK 버전과 적용된 게임이 달라요.

구분 Unreal Unity
LinkSDK 버전 v2.0.2 v1.3.6 / v2.0.2
엔진 지원 버전 UE 5.4 ~ 5.6 Unity 2022.3.10f1 / Unity 6



동작 원리

플레이어가 모바일에서 스트리밍을 시작하면 스토브 서버 인프라를 거쳐 WebRTC 세션이 수립돼요.
게임은 SDK 초기화와 콜백 등록만 담당하고, 실제 미디어 전송과 입력 라우팅은 SDK가 처리해요.

단계 동작 주체
1. 세션 요청 모바일에서 게임 선택 후 스트리밍 요청 발송. Player → STOVE App → STOVE Server
2. 매칭 사용 가능한 PC streamer 조회 후 모바일에 회신. STOVE Server (Matchmaker)
3. SDK 초기화 PCSDK·StreamingSDK 초기화, 게임 프로세스 시작. STOVE App → BaseSDK → Game
4. WebRTC 협상 Offer/Answer 교환, ICE Candidate 교환, TURN credential 발급. STOVE App ↔ StreamingSDK ↔ Game
5. 스트리밍 게임 프레임 인코딩 후 WebRTC 미디어 채널로 전송, 모바일 화면에 표시. Game → StreamingSDK → STOVE App → Player

스트리밍에는 외부 영역이 포함되지 않아요
게임에서 외부 브라우저나 웹뷰로 호출되는 영역(빌링 결제창, 외부 링크, 인게임 웹뷰 등)은 스트리밍 대상에서 제외돼요.
PC에서는 정상 표시·동작하지만 모바일 스트리밍 화면에서는 확인할 수 없으니 인게임 內에서 별도 안내 메시지를 노출하도록 처리해야 해요.



권장 사양 및 지원 환경

스토브링크는 PC와 모바일 양쪽의 환경 조건을 모두 만족해야 정상 동작해요.

구분 요구 사항
PC 운영체제 Windows 10 또는 Windows 11 (64-bit)
PC GPU NVENC 지원 NVIDIA GPU 권장 (AMD·Intel은 원활하지 않을 수 있음).
모바일 OS Android 10+ / iOS 15+
스트리밍 화질 최대 1080p / 60fps, end-to-end 지연 150ms 이하.
네트워크 Wi-Fi 또는 5G·LTE. 데이터 사용 시 통신 요금 발생.



제약 사항

스토브링크 적용 전 사전에 검토해야 할 제약 사항이에요.
대부분 인게임에서 별도 처리가 필요한 항목이라 기획 단계부터 반영해 두는 것이 좋아요.

제약 내용
외부 웹페이지 미지원 외부 브라우저(Chrome, Edge 등)와 인게임 웹뷰는 스트리밍되지 않음. 인게임 안내 처리 필요.
동시 스트리밍 제한 계정 단위로만 실행 가능(캐릭터 단위 불가). 한 계정·한 게임은 한 모바일 기기에서만 실행 가능.
게임창 최소화 (Unreal) Unreal 엔진은 최소화된 윈도우에서 렌더링을 중단하므로 스트리밍 불가능.
PC 환경 변화 절전모드·화면 잠금·최대 절전모드에서는 스트리밍이 느려지거나 중단될 수 있음.
네트워크 의존 실시간 데이터 전송이 필요해 네트워크 속도 부족 시 영상 끊김 또는 깨짐 발생.

연동 가이드



연동 준비

PC SDK 연동

스토브링크는 STOVE Base SDK 기반에서 동작해요.
연동 전 STOVE PC SDK 3.4 이상이 게임에 통합되어 있어야 하며, Base SDK가 정상 초기화된 후에 STOVELINK SDK를 초기화해요.



계정 및 인증 정보

스토브링크 연동에는 환경별 인증 정보가 필요해요.
Sandbox에서 충분히 검증한 후 Live로 전환하는 것을 권장해요.

항목 설명
환경 Sandbox(SB) / Live 두 환경 제공.
AppKey 게임 식별을 위한 공개 키. 환경별로 다르게 발급.
AppSecret 게임 인증용 시크릿 키. 외부 노출 금지.
GameId 파트너스에 등록된 게임 고유 ID.

발급 정보는 [파트너스 포탈]에서 확인 가능하며, 별도 발급 요청은 퍼블리싱 기술 담당자를 통해 진행해요.



파트너스 등록

스토브링크를 사용하려면 파트너스에서 게임별 스트리밍 정보와 알림 설정을 미리 등록해 둬야 해요.
등록 요청은 퍼블리싱 기술 담당자에게 문의해주세요.

항목 등록 내용
스토브링크 사용 신청 파트너스 포털에서 스토브링크 사용 신청. 라이브 ON/OFF, 게임 ID, 빌드 버전 등 기본 정보 등록.
스트리밍 기능 설정 OTP·컨트롤러·채팅·알림 사용 유무, 지원 해상도(1080p / 720p / 480p / 360p) 설정.
알림 키 등록 (알림 기능 사용 시) 알림 메시지·알림 아이콘·언어별 메시지 등록.

  • 파트너스 설정 (퍼블리싱 기술 담당자에게 요청)
    • 스트리밍 기능 설정

  • 알림 키 등록



기본 연동 흐름

플레이어가 PC에서 게임을 선택해 모바일로 스트리밍하기까지의 전체 흐름을 단순화해서 보여줘요.
어느 단계에서 모바일·PC·서버가 각각 무엇을 하는지 빠르게 파악할 수 있어요.


상세 흐름은 개발 가이드에서
위 시퀀스는 전체 흐름의 큰 그림이에요.
SDK 초기화·콜백 등록 등 엔진별 구체 단계는 개발하기 > 개발 흐름에서 Unreal · Unity 각각 확인할 수 있어요.



외부 링크 예외 처리

인게임에서 외부 브라우저나 웹뷰로 호출되는 영역은 스트리밍 화면에서 표시되지 않으므로,
스트리밍 상태일 때는 안내 메시지를 노출하고 해당 기능을 차단하는 처리가 필요해요.

예외 처리 대상 처리 방식
빌링 결제 창 결제 Confirm 클릭 시 "스토브링크 플레이 중 이용 불가 안내" 팝업 노출.
외부 링크 커뮤니티·FAQ·개인정보 처리방침 등 External Link 클릭 시 동일 안내 팝업 노출.
인 게임 웹뷰 확률 정보·게임 안내·쿠폰 입력 등 In-App WebView 호출 시 동일 안내 팝업 노출. 스토브링크 플레이가 아닌 경우 정상 노출.



  • 예외 처리 예시
    • 빌링 결제 창

  • 외부 링크(커뮤니티, FAQ, 개인정보 처리 방침 등)

  • 인 게임 웹 뷰 (확률 정보, 게임 안내, 쿠폰 입력 등)

권장 안내 문구
"스토브링크 플레이 중입니다. 해당 기능은 스토브링크 플레이 종료 후 사용할 수 있습니다." 와 같이 이용자가 현재 상태와 해결 방법을 모두 인지할 수 있는 문구로 제공해요.

개발하기


SDK 다운로드

사용 중인 엔진과 버전에 맞는 SDK를 다운로드해서 시작해요. 파일명을 클릭하면 바로 다운로드되며, 최신 변경 이력은 릴리즈 노트에서 확인할 수 있어요.

엔진 SDK 파일 지원 환경 버전
Unity STOVELINK_Unity_1.3.6.unitypackage Unity 2022.3 v1.3.6
Unity STOVELINK_Unity_2.0.2.unitypackage Unity 6 v2.0.2
Unreal LINKSDK_v.3.0.2_UNREAL_v5.6.zip UE 5.4 ~ 5.6 v3.0.0

다운로드 후 진행 순서
SDK를 받은 후에는 사전 준비에서 환경 요구 사항을 점검하고, 개발 흐름의 엔진별 단계를 따라가요.

사전 준비

스토브링크 SDK를 코드에 적용하기 전에 연동 가이드 > 연동 준비 단계가 완료되어 있어야 하고, 사용 엔진에 따라 아래 환경 요구 사항을 만족해야 해요.


  • Unreal 환경 요구 사항
    항목 내용
    Unreal Engine UE 5.4 ~ 5.6 (현재 LinkSDK v3.0.0은 UE 5.6 기준)
    개발 환경 Visual Studio 2022, .NET Framework 4.8, DirectX
    대상 OS Windows 10 / 11 (x64)
    WebRTC M96 ~ M109 호환
    BaseSDK (PCSDK) v3.4 이상
    권장 사양 Intel Core i5 이상 / NVIDIA GTX 1060 이상 / RAM 16GB 이상
    프로젝트 유형 C++ 프로젝트 또는 Blueprint 프로젝트 모두 지원

  • Unity 환경 요구 사항
    항목 내용
    Unity 버전 Unity 2022.3.10f1 이상 (2022.3.22f1 권장) 또는 Unity 6
    - Unity 2022.3용: STOVELINK_Unity_1.3.6
    - Unity 6용: STOVELINK_Unity_2.0.2
    개발 환경 Visual Studio 2019 이상, C# Scripts
    대상 OS Windows 10 / 11 (x64)
    Scripting Backend IL2CPP
    필수 Unity Package Input System (1.7.0 이상)
    ※ 기존 Input System 패키지가 설치되어 있다면 STOVELINK 패키지의 것을 사용하기 위해 한 번 제거 후 재설치 권장.
    WebRTC com.unity.webrtc 3.0.0-pre8 (Unity SDK 내부에서 자동 관리)

개발 흐름


Unreal

  • Step 1. 플러그인 설치
    항목 내용
    플러그인 복사 위치 YourProject/Plugins/STOVELINK/
    초기화 스크립트 실행 플러그인 폴더의 RunMeFirst.bat를 한 번 실행해 의존 파일 복사.
    C++ 프로젝트의 경우 .uproject 파일 우클릭 → Generate Visual Studio project files 실행하여 IDE 프로젝트 갱신.

  • Step 2. 플러그인 활성화 활성화 방법은 두 가지 중 하나를 선택해요.

  • 방법 A. Unreal Editor에서 활성화
    1. Editor 실행 후 Edit → Plugins 메뉴 진입
    2. 기본 제공되는 Pixel Streaming 플러그인을 비활성화
    3. STOVE Streaming 플러그인을 활성화
    4. Editor 재시작

Pixel Streaming은 반드시 비활성화해야 해요.
두 플러그인이 동시에 활성화되면 충돌이 발생해 스트리밍이 정상 작동하지 않아요.


  • 방법 B. .uproject 파일 직접 수정
    json
    "Plugins": [
      {
        "Name": "PixelStreaming",
        "Enabled": false
      },
      {
        "Name": "STOVELINK",
        "Enabled": true
      }
    ]
    



  • Step 3. BaseSDK 초기화 확인 스토브링크는 BaseSDK 초기화 성공 이후에만 동작해요. 게임 초기화 시점에 BaseSDK의 Base_Initialize 콜백에서 IsSuccessful()true인지 반드시 확인해 주세요.


  • Step 4. 의존성 추가 및 SDK 초기화 C++ 프로젝트와 Blueprint 프로젝트에서 방식이 달라요.

  • C++ 프로젝트YourProject.Build.cs에 의존성을 추가해요.
    csharp
    // 1) ThirdParty 경로
    string ThirdPartyPath = Path.Combine(
        PluginDirectory, 
        "../../Plugins/STOVELINK/ThirdPartyLibrary/StovePCSDK/BaseSDK/Deploy"
    );
    // 2) BaseSDK 라이브러리 연결
    PublicAdditionalLibraries.Add(Path.Combine(ThirdPartyPath, "BaseSDK.lib"));
    RuntimeDependencies.Add(Path.Combine(ThirdPartyPath, "BaseSDK.dll"));
    // 3) STOVELINK 모듈 의존성 추가
    PublicDependencyModuleNames.AddRange(new string[] { "STOVELINK" });
    

    Base_Initialize 콜백에서 스토브링크 초기화를 호출해요.
    cpp
    void AYourGameMode::HandleBaseInitialize(const FBaseInitResult& Result)
    {
        if (!Result.IsSuccessful()) return;
        // 스토브링크 초기화
        UStoveLinkSubsystem::Link_Initialize();
    }
    

  • Blueprint 프로젝트 Blueprint 이벤트 그래프에서 다음 노드를 순서대로 연결해요.
    • Event Begin PlayLink Initialize (Blueprint 노드)
    • Link Set On Player Connected / Link Set On Player Disconnected (콜백 등록)
    • 필요에 따라 Link Set Bitrate, Link Toggle Mobile Virtual Keyboard, Link Send Mobile Notify 등 호출

    스트리밍 컴포넌트는 USTOVELINKStreamerComponent를 액터에 추가하고 OnStreamStarted / OnStreamStopped 이벤트를 바인딩해 사용해요.



  • Step 5. 콜백 등록 및 기능 호출 스트리밍 상태 변화·모바일 입력·알림 송신 등 부가 기능을 콜백 기반으로 처리해요. 사용 가능한 함수는 다음과 같아요. (상세 스펙은 API 레퍼런스 메뉴 참고)
    기능 사용 시점 및 권장 처리
    Link_IsStreamingEnabled 스토브링크 기능이 게임 정책 상 활성화되어 있는지 확인.
    비활성화 시 일반 로컬 플레이 경로로 진입.
    Link_IsStreaming 현재 모바일과 실시간 스트리밍 연결 중인지 확인.
    모바일 전용 UI 분기 처리에 사용.
    Link_SetBitrate 영상 비트레이트 동적 조절.
    권장값: 저화질 1Mbps · 일반 3Mbps · 고화질 5Mbps · 초고화질 10Mbps.
    Link_ToggleMobileVirtualKeyboard 게임 내 텍스트 입력 필드 포커스 시 모바일 가상 키보드 호출/숨김 처리.
    스트리밍 연결 상태에서만 동작.
    Link_SetOnReceiveUIText 모바일 입력 텍스트가 게임으로 전달될 때 처리할 콜백 등록.
    enableSetReceivedText 옵션에 따라 마지막 포커스된 위젯에 자동 설정 또는 콜백만 호출.
    Link_SendMobileNotify 게임 이벤트(아이템 획득, 캐릭터 사망 등)를 모바일 앱 알림으로 전송.
    파트너스에 사전 등록한 알림 키와 변수 매핑 필요.
    Link_SetOnPlayerConnected 모바일 클라이언트 연결 시점 콜백.
    스트리밍 전용 UI 활성화 처리에 사용.
    Link_SetOnPlayerDisconnected 모바일 클라이언트 연결 종료 시점 콜백.
    게임 진행 일시 정지 등 후속 처리에 사용.

Link_SetOnReceiveUIText는 기존 콜백을 덮어써요.
같은 콜백을 두 번 등록하면 이전 등록이 무효화돼요. 게임 전역에서 한 곳에만 등록하거나, 콜백 내부에서 디스패치 로직을 직접 관리해 주세요.



  • Step 6. 빌드 및 검증 빌드 후 다음 로그가 출력되는지 확인해요.
    text
    STOVELINK runtime initialized (Streaming Enabled = true)
    

    YourProject/Intermediate/Build/Win64/에 STOVELINK 모듈 폴더가 생성되어 있어야 정상이에요.



  • Step 7. v2 → v3 마이그레이션 (해당 시) 기존 v2 코드를 사용 중인 프로젝트는 v3로 업그레이드 시 다음을 처리해요.

  • 유지 가능한 부분
    • #include "STOVELINKSdk.h"는 그대로 사용 가능해요. (STOVELINK 네임스페이스가 LINKSDK의 Alias로 유지돼요.)
    • 기존 함수 호출 코드는 변경 없이 컴파일돼요.

  • 필수 변경 사항.uproject*.Build.cs의 모듈 의존성 참조를 변경해 주세요.
    csharp
    // AS-IS (v2)
    PublicDependencyModuleNames.AddRange(new string[] { "STOVELINK" });
    
    // TO-BE (v3)
    PublicDependencyModuleNames.AddRange(new string[] { "PixelStreaming" });
    



Unity

  • Step 1. Package 설치
    1. SDK 다운로드 페이지에서 사용 Unity 버전에 맞는 .unitypackage를 다운로드
    2. Unity Editor의 Assets → Import Package → Custom Package로 패키지 임포트
    3. 임포트 시 Input System 패키지가 이미 설치되어 있다면, 충돌 방지를 위해 기존 Input System을 먼저 제거하고 STOVELINK 패키지의 것을 사용하도록 권고



  • Step 2. 멀티플랫폼 전처리 스토브링크 SDK는 Windows Standalone 런타임에서만 동작해요. Editor·모바일·Linux 등 다른 빌드 타깃에서는 컴파일 오류 없이 무시되도록 모든 SDK 호출을 전처리기로 감싸 주세요.
    csharp
    #if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
        // 스토브링크 SDK 호출 코드
    #endif
    



  • Step 3. SDK 초기화 및 로그 초기화 BaseSDK 초기화 후 스토브링크 SDK와 로그 기능을 차례로 초기화해요.
    csharp
    #if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
        // 1) BaseSDK 초기화 완료 확인 (PCSDK3 콜백)
        // 2) 스토브링크 SDK 초기화
        SignalingManager.Initialize();
        
        // 3) 로그 적재 초기화 (운영 환경 디버깅을 위해 권장)
        SignalingManager.InitializeLogger();
    #endif
    



  • Step 4. Remote Control 활성화 게임이 Unity Input System을 사용 중이라면 자동으로 호환돼요. 기존 UI(uGUI)를 사용한다면 EventSystem의 입력 모듈 교체가 필요해요.
    사용 중인 입력 시스템 처리 방법
    Unity Input System 패키지 임포트 시 Warning 팝업이 나타나면 Yes 선택 후 Editor 재시작.
    기존 Unity UI (uGUI) 씬의 EventSystem 게임오브젝트에서 Standalone Input ModuleReplace with InputSystemUIInputModule 클릭.


  • Step 5. 스트리밍 접속 상태 콜백 및 예외 처리 모바일 연결 시점·종료 시점을 받아 게임 UI를 분기 처리해요. 또한 스트리밍 중 일부 화면(빌링 결제창·외부 링크·게임 내 웹뷰)은 모바일 환경에서 정상 동작하지 않으므로 별도 예외 처리가 권장돼요.
    csharp
    #if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
        SignalingManager.OnStreamingConnect += OnStreamingConnect;
        SignalingManager.OnStreamingDisconnect += OnStreamingDisconnect;
    #endif
    
    void OnStreamingConnect()
    {
        // 모바일 연결됨 — 모바일 전용 UI 활성화
    }
    
    void OnStreamingDisconnect()
    {
        // 모바일 연결 종료 — 게임 일시 정지 권장
    }
    
    bool IsPlayerConnected()
    {
    #if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
        return SignalingManager.IsStreamingEnabled() != PARAM_SETTER.NONE;
    #else
        return false;
    #endif
    }
    

빌링 결제창 · 외부 링크 · 인게임 웹뷰는 모바일 스트리밍 환경에서 막아 주세요.

모바일 클라이언트는 PC와 다르게 외부 브라우저 호출이나 결제 UI를 정상 렌더링할 수 없어요.
해당 화면 진입 시 IsPlayerConnected()로 판단해 PC 환경 안내 메시지로 우회시키는 것을 권장해요.



  • Step 6. 부가 기능 (알림 · 가상 키보드 · 가상 컨트롤러)

  • 모바일 앱으로 알림 보내기 (SendGameNotify) 게임 이벤트를 모바일 앱 알림으로 전송해요. 파트너스에 사전 등록한 알림 키와 변수 매핑을 사용해요.
    csharp
    var payload = "{ \"message1\": \"홀리나이트\", \"message2\": \"전설\", \"message3\": \"왜곡된 악몽의 궤적 헤비 건틀릿\" }";
    signalingManager.SendGameNotify(integrationKey, payload, (statusCode) => {
        // 결과 코드는 로깅 용도로만 사용해요. 게임 플레이에 영향 주지 않도록 처리해요.
    });
    

    알림 API 호출이 실패하더라도 게임 진행에 영향을 주지 않아야 해요. 별도의 에러 메시지 노출 없이 로깅만 권장해요. 에러 코드 상세는 API 레퍼런스 메뉴를 참고해 주세요.

  • 가상 키보드 사용 (CommandMsg.OnReceiveText) 스트리밍 상태에서 텍스트 입력이 필요할 때, 모바일 키보드에서 입력된 텍스트를 게임 UI로 받아 처리해요.
    csharp
    #if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
        CommandMsg.OnReceiveText += CommandMsg_OnReceiveText;
    #endif
    
    void CommandMsg_OnReceiveText(string text)
    {
        // 현재 선택된 InputField에 텍스트 반영
        GameObject obj = EventSystem.current.currentSelectedGameObject;
        if (obj.GetComponent<InputField>() != null)
        {
            obj.GetComponent<InputField>().text = text;
        }
        else if (obj.GetComponent<TMP_InputField>() != null)
        {
            obj.GetComponent<TMP_InputField>().text = text;
        }
    }
    

  • 모바일 앱에서 가상 컨트롤러 표시 제어 (CommandMsg.OnShowVirtualController) 모바일 앱의 링크 옵션에서 컨트롤러를 켜고 끄면 게임에서 콜백을 받아 화면의 가상 컨트롤러 UI를 토글해요. UI 토글 로직은 게임 측에서 직접 구현해야 해요.
    csharp
    #if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
        CommandMsg.OnShowVirtualController += OnShowVirtualControllerCallback;
    #endif
    
    void OnShowVirtualControllerCallback(bool isShow)
    {
        // 샘플: 가상 컨트롤러 Canvas 활성화 토글
        var controller = GameObject.Find("UI_Canvas_StarterAssetsInputs_Joysticks");
        var canvas = controller.GetComponent<Canvas>();
        canvas.enabled = isShow;
    }
    



  • Step 7. SDK 제거 (필요 시) 스토브링크 SDK를 프로젝트에서 제거할 때는 두 가지 방법이 있어요.
    방법 절차
    안정적인 삭제 Unity Package Manager에서 STOVELINK 관련 패키지를 모두 Remove한 후, Assets/StreamingAssets/ 내 STOVELINK 폴더 수동 삭제.
    빠른 삭제 SDK 패키지에 포함된 delete_package.bat 파일을 PowerShell에서 실행. 재 임포트 시 패키지 목록에 NEW 아이콘이 표시되면 정상 제거.

테스트 및 검증

연동 작업 완료 후 Sandbox(SB) → Live 순으로 테스트해요. 테스트 대상 게임에 대한 화이트 리스트 등록이 필요해요. (퍼블리싱 기술 담당자에게 등록 요청)

단계 테스트 내용 구분
1. PC 클라이언트 Sandbox(SB) / Live 환경에 맞는 클라이언트 다운로드 후 설치. STOVE PC 클라이언트
2. 게임 설치 및 빌드 등록 개발 빌드를 파트너스에 업로드 후 PC 클라이언트로 게임 설치·실행.
(빌드 업데이트 시마다 파트너스에 새 빌드 업로드)

스토브링크 사용(ON) 설정 상태에서 게임 실행 필요.
-
3. 스토브 앱 설치 스토브 앱 설치 및 실행 후, PC 클라이언트에서 로그인한 계정으로 스토브 앱 로그인
Android - 최신 버전 테스트앱 설치.
APK 다운로드(SB)
APK 다운로드(Live)
iOS - TestFlight 또는 QR 코드로 설치.
- Live: TestFlight

- Live: QR 코드 이용
APK 다운로드(SB)
TestFlight(Live)
4. 플레이 테스트 - 입력(터치 조작)이 정상 반응하는지
- 옵션 패널에서 사운드 · 알림 · 컨트롤러 · 해상도 · 가상 키보드 토글이 정상 동작하는지
- 알림 발송 시 모바일 앱에서 수신 및 다국어 메시지가 정상 노출되는지
- 연결 종료 · 재연결 시 게임 측 콜백이 정상 호출되는지
-

알림
Sandbox(SB)환경의 경우, 스마일게이트 사내 망에서만 이용 가능해요.

트러블슈팅

  • 환경 · 실행 점검
    • 1) 로그 파일이 생성되지 않아요
      • %appdata% 경로에 StoveLink 관련 로그가 생성되는지 확인해 주세요.
      • 이용자 폴더 경로에 한글이 포함되어 있으면 로그 생성이 실패할 수 있어요. ASCII 문자 경로로 이용자 환경을 이동하거나 별도 이용자 계정에서 테스트해 주세요.



    • 2) 스토브 런처에서 스트리밍 버튼이 비활성화돼요 런처 정책 설정 파일에서 enable_linkplay 옵션을 활성화했는지 확인해요.
      text
      경로: C:\Users\{UserName}\AppData\Local\STOVE{Env}\Config\policyConfig.json
      
      json
      {
        "stove_launcher_policy_config": {
          "enable_linkplay": true
        }
      }
      



    • 3) LinkPlay 기능이 비활성화 처리되었다면 특정 게임에 대해 LinkPlay 노출이 비활성화된 상태라면, 이용자별 PersonalConfig.json에 게임 ID를 직접 등록해 임시 우회할 수 있어요. 수정 후 스토브 런처를 재시작해야 적용돼요.
      text
      경로: C:\Users\<UserName>\AppData\Local\STOVEGATE8\Config\<MemberNumber>\PersonalConfig.json
      
      json
      {
        "streamingGameIds": ["<GameID>"]
      }
      



    • 4) 회원번호를 확인하고 싶어요 로그 파일 내 WebSocket 연결 로그에서 회원번호를 확인할 수 있어요. 예시에서 108195073이 회원번호예요. 또는 스토브 프로필 페이지에서도 확인 가능해요.
      text
      [DBG] Signaling: Connecting WS wss://stovelink-ss.gate8.com:8888/s/108195073-1
      



  • 네트워크 점검
    • 5) CDN 연결 확인 로그에 다음 CDN 요청 성공 메시지가 있는지 확인해요. 해당 로그가 누락되어 있다면 방화벽 · 네트워크 설정을 점검하고, VPN/프록시 차단 여부를 확인해 주세요.
      text
      BaseAPIRequest: https://static-resource.gate8.com/.../config_streaming.json HTTP request successfully (OK)
      



    • 6) WebSocket 연결 확인 정상 연결 시 다음 로그가 출력돼요. 해당 로그가 누락되어 있다면 네트워크 환경 · 보안 소프트웨어 차단 여부 · 환경설정 파일을 점검해 주세요.
      text
      [DBG] Signaling: WS connected.
      



  • 기능별 이슈
    • 7) 특정 씬에서 오디오가 송출되지 않아요 스토브링크 초기화 이전에 사운드 관련 인스턴스가 먼저 생성되어 있어야 해요. 게임 초기 시점에 오디오 시스템을 먼저 구동한 후 스토브링크 초기화를 호출해 주세요.

Unreal에서는 FApp::SetUnfocusedVolumeMultiplier(1.0f);를 스토브링크 초기화 이전에 호출하면 게임이 포커스를 잃어도 스트리밍 오디오를 유지할 수 있어요. (v1.2.9에서 자동 호출 제거됨)


  • 8) UMG가 아닌 커스텀 UI 사용 시 모바일 키보드 호출에서 크래시가 발생해요 LinkSDK v1.2.5부터 자동 키보드 호출이 비활성화됐어요. CP(게임) 측에서 수동으로 키보드를 호출하는 API(Link_ToggleMobileVirtualKeyboard)를 사용해 주세요.



  • 9) Unreal 5.6 빌드에서 Debug · DebugGame · Test 구성으로 빌드되지 않아요 LinkSDK v2.0.2(2026-01-26 빌드)에서 누락된 빌드 구성이 보완됐어요. 최신 SDK로 업데이트해 주세요.



  • 10) Unity에서 Input System 패키지 충돌이 나요 기존 프로젝트에 Input System 패키지가 이미 설치되어 있다면 STOVELINK 패키지의 것과 충돌할 수 있어요. 기존 Input System을 제거한 후 STOVELINK 패키지의 것으로 재설치하고 Editor를 재시작해 주세요.



  • 11) Unity 패키지 충돌로 WebRTC 버전이 3.0.0-pre7로 되돌아가요 Unity SDK v1.3.6 이상에서 해결됐어요. SDK를 최신 버전으로 업데이트하면 3.0.0-pre8이 유지돼요.

응답 코드 · 에러 코드의 상세 의미는 API 레퍼런스 메뉴를 참고해 주세요.
알림 API · 스트리밍 콜백 등에서 반환되는 HTTP Status Code · Error Code의 전체 목록은 별도 메뉴에서 관리돼요.

샘플 코드

  • Unreal C++ — 초기화부터 부가 기능까지Base_Initialize 콜백 → 스토브링크 초기화 → 콜백 등록 → 알림 송신까지 한 흐름으로 구성한 샘플이에요.
cpp
// YourGameMode.h
#include "STOVELINKSdk.h"

UCLASS()
class YOURGAME_API AYourGameMode : public AGameModeBase
{
    GENERATED_BODY()

public:
    virtual void BeginPlay() override;

private:
    void HandleBaseInitialize(const FBaseInitResult& Result);
    void OnPlayerConnected(FString StreamerId, FString PlayerId, bool bQualityController);
    void OnPlayerDisconnected(FString StreamerId, FString PlayerId, bool bQualityController);
    void OnReceiveUIText(FString TextReceived);

    void NotifyAchievementUnlocked(const FString& AchievementName);
};
cpp
// YourGameMode.cpp
void AYourGameMode::BeginPlay()
{
    Super::BeginPlay();

    // BaseSDK 초기화 콜백 등록 (PCSDK3 영역)
    // 예시상 외부에서 RegisterInitCallback 형태로 등록한다고 가정해요.
    BaseSDK::SetOnInitialize([this](const FBaseInitResult& Result) {
        HandleBaseInitialize(Result);
    });
}

void AYourGameMode::HandleBaseInitialize(const FBaseInitResult& Result)
{
    if (!Result.IsSuccessful())
    {
        UE_LOG(LogTemp, Warning, TEXT("BaseSDK init failed. Skip STOVELINK init."));
        return;
    }

    // 1) 스토브링크 SDK 초기화
    UStoveLinkSubsystem::Link_Initialize();

    // 2) 스트리밍 기능 활성화 여부 확인
    if (!UStoveLinkSubsystem::Link_IsStreamingEnabled())
    {
        UE_LOG(LogTemp, Log, TEXT("STOVELINK disabled by policy. Local play only."));
        return;
    }

    // 3) 콜백 등록
    UStoveLinkSubsystem::Link_SetOnPlayerConnected(
        [this](FString S, FString P, bool Q) { OnPlayerConnected(S, P, Q); }
    );
    UStoveLinkSubsystem::Link_SetOnPlayerDisconnected(
        [this](FString S, FString P, bool Q) { OnPlayerDisconnected(S, P, Q); }
    );

    // 4) 가상 키보드 입력 콜백 (마지막 포커스 위젯에 자동 반영 옵션 포함)
    UStoveLinkSubsystem::Link_SetOnReceiveUIText(
        [this](FString Text) { OnReceiveUIText(Text); },
        /* enableSetReceivedText */ true
    );

    // 5) 초기 비트레이트 설정 (3Mbps)
    UStoveLinkSubsystem::Link_SetBitrate(3000000);
}

void AYourGameMode::OnPlayerConnected(FString StreamerId, FString PlayerId, bool bQualityController)
{
    // 모바일 클라이언트 연결됨 — 모바일 전용 UI 활성화
}

void AYourGameMode::OnPlayerDisconnected(FString StreamerId, FString PlayerId, bool bQualityController)
{
    // 모바일 클라이언트 연결 종료 — 게임 일시 정지 등 후속 처리
}

void AYourGameMode::OnReceiveUIText(FString TextReceived)
{
    // 콜백 단독으로 추가 처리하고 싶을 때만 사용
    UE_LOG(LogTemp, Log, TEXT("Mobile keyboard text received: %s"), *TextReceived);
}

void AYourGameMode::NotifyAchievementUnlocked(const FString& AchievementName)
{
    const FString IntegrationKey = TEXT("game.achievement.unlocked");
    const FString Payload = FString::Printf(
        TEXT("{ \"message1\": \"%s\" }"), *AchievementName
    );
    const FString LangCode = TEXT("ko");

    UStoveLinkSubsystem::Link_SendMobileNotify(
        IntegrationKey,
        Payload,
        LangCode,
        [](int32 StatusCode) {
            // 게임 진행에 영향 주지 않도록 로깅만 처리
            UE_LOG(LogTemp, Log, TEXT("SendMobileNotify result: %d"), StatusCode);
        }
    );
}

  • Unreal Blueprint — 노드 구성 가이드 Blueprint 기반 프로젝트에서는 다음 패턴으로 동일한 흐름을 구성할 수 있어요.
text
[Event Begin Play]
   └─→ [Link Initialize]
         └─→ [Branch: Link Is Streaming Enabled]
               ├─ True  → [Link Set On Player Connected]   (Custom Event 바인딩)
               │         → [Link Set On Player Disconnected]
               │         → [Link Set On Receive UI Text]
               │         → [Link Set Bitrate (3000000)]
               │         → [Setup Streaming UI]
               └─ False → [Show Local Play Only Message]

[Custom Event: OnAchievementUnlocked (Name: String)]
   └─→ [Make JSON: {"message1": Name}]
         └─→ [Link Send Mobile Notify]
               └─→ [Branch: Status Code == 0]
                     ├─ True  → [Log: "Notify sent"]
                     └─ False → [Log: "Notify failed (silent)"]

스트리밍 컴포넌트는 액터에 USTOVELINKStreamerComponent를 추가하고 OnStreamStarted · OnStreamStopped 이벤트를 바인딩해 처리해요.


  • Unity C# — 초기화부터 부가 기능까지
csharp
using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;
using TMPro;
using StoveLink;

public class StoveLinkBootstrap : MonoBehaviour
{
    [SerializeField] private GameObject virtualControllerCanvas;

    private void Start()
    {
#if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
        // 1) BaseSDK 초기화는 PCSDK3 영역에서 먼저 완료된 상태라 가정
        
        // 2) 스토브링크 SDK + 로그 초기화
        SignalingManager.Initialize();
        SignalingManager.InitializeLogger();

        // 3) 활성화 정책 확인
        if (SignalingManager.IsStreamingEnabled() == PARAM_SETTER.NONE)
        {
            Debug.Log("STOVELINK disabled by policy. Local play only.");
            return;
        }

        // 4) 접속 상태 콜백 등록
        SignalingManager.OnStreamingConnect += OnStreamingConnect;
        SignalingManager.OnStreamingDisconnect += OnStreamingDisconnect;

        // 5) 가상 키보드 입력 콜백
        CommandMsg.OnReceiveText += OnReceiveText;

        // 6) 가상 컨트롤러 표시 제어 콜백
        CommandMsg.OnShowVirtualController += OnShowVirtualController;
#endif
    }

#if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
    private void OnStreamingConnect()
    {
        // 모바일 연결됨 — 스트리밍 전용 UI 활성화
    }

    private void OnStreamingDisconnect()
    {
        // 모바일 연결 종료 — 게임 일시 정지 권장
    }

    private void OnReceiveText(string text)
    {
        GameObject obj = EventSystem.current.currentSelectedGameObject;
        if (obj == null) return;

        if (obj.GetComponent<InputField>() != null)
        {
            obj.GetComponent<InputField>().text = text;
        }
        else if (obj.GetComponent<TMP_InputField>() != null)
        {
            obj.GetComponent<TMP_InputField>().text = text;
        }
        Debug.Log($"Mobile keyboard text received: {text}");
    }

    private void OnShowVirtualController(bool isShow)
    {
        if (virtualControllerCanvas == null) return;
        var canvas = virtualControllerCanvas.GetComponent<Canvas>();
        canvas.enabled = isShow;
    }

    // 외부에서 호출할 알림 메서드
    public void NotifyAchievementUnlocked(string achievementName)
    {
        string integrationKey = "game.achievement.unlocked";
        string payload = $"{{ \"message1\": \"{achievementName}\" }}";

        SignalingManager.Instance.SendGameNotify(
            integrationKey,
            payload,
            (statusCode) => {
                // 게임 진행에 영향 주지 않도록 로깅만 처리
                Debug.Log($"SendGameNotify result: {statusCode}");
            }
        );
    }
#endif

    private void OnDestroy()
    {
#if UNITY_STANDALONE_WIN && !UNITY_EDITOR_WIN
        SignalingManager.OnStreamingConnect -= OnStreamingConnect;
        SignalingManager.OnStreamingDisconnect -= OnStreamingDisconnect;
        CommandMsg.OnReceiveText -= OnReceiveText;
        CommandMsg.OnShowVirtualController -= OnShowVirtualController;
#endif
    }
}

샘플 코드는 그대로 복사해 사용 가능하지만, 게임 구조에 맞춰 콜백 등록 시점·정리 시점을 조정해 주세요.
특히 콜백은 OnDestroy 또는 씬 전환 시점에 반드시 해제해야 메모리 누수와 중복 호출을 방지할 수 있어요.

자주 묻는 질문



Q1. Unreal과 Unity 중 어느 엔진에서 사용 가능한가요?
A. 양쪽 모두 지원해요.
Unreal은 UE 5.4~5.6 버전에서 LinkSDK v2.0.2 / v3.0.0을 사용하고, Unity는 2022.3 / Unity 6 환경에서 LinkSDK v1.3.6 / v2.0.2를 사용해요.
엔진별로 적용된 게임과 권장 SDK 버전이 다르니 사전 준비 단계에서 다운로드 링크를 확인해주세요.
Q2. AMD나 Intel GPU에서도 동작하나요?
A. 동작은 가능하지만 권장하지 않아요.
스토브링크는 NVIDIA GPU의 NVENC 하드웨어 가속 비디오 인코딩을 기반으로 설계되어 있어, AMD·Intel GPU에서는 원활한 스트리밍이 어려울 수 있어요.
지원되는 NVIDIA GPU 목록은 Pixel Streaming 공식문서에서 확인할 수 있어요.
Q3. STOVELINK SDK 초기화는 언제 호출하면 되나요?
A. STOVE Base SDK가 정상 초기화된 후에 호출해야 해요.
Unreal은 Base_Initialize 콜백에서 IsSuccessful() == true 확인 후 STOVELINK::Link_Initialize()를 호출하고, Unity는 View_Initialize·IAP_Initialize 이후 STOVELINK.RenderStreaming.CreateAutomaticStreaming()을 호출해요.
초기화 순서를 지키지 않으면 스트리밍 기능이 활성화되지 않아요.
Q4. 스트리밍 중인지 게임에서 어떻게 알 수 있나요?
A. 두 가지 API를 조합해 사용해요.
Link_IsStreamingEnabled()는 빌드·설정 기준으로 스트리밍 기능이 활성화되어 있는지를 반환하고, Link_IsStreaming()은 현재 WebRTC 세션이 실제로 활성화되어 있는지를 반환해요.
플레이어가 모바일에서 접속해 있는지 확인하려면 OnPlayerConnected / OnPlayerDisconnected 콜백을 등록하거나 GetIsPlayerConnected()로 폴링하면 돼요.
Q5. 외부 링크나 인게임 웹뷰는 왜 스트리밍이 안 되나요?
A. 스토브링크는 게임 엔진이 렌더링하는 프레임을 GPU에서 인코딩해 전송해요.
외부 브라우저(Chrome, Edge 등)나 인게임 웹뷰는 게임 엔진 렌더링 파이프라인 외부에서 동작하기 때문에 스트리밍 화면에 포함되지 않아요.
이용자 혼란을 줄이기 위해 스트리밍 상태일 때는 해당 기능을 차단하고 안내 팝업을 노출하는 것을 권장해요.
Q6. 비트레이트는 어떤 값으로 설정하면 되나요?
A. 권장 비트레이트는 저화질 1Mbps, 일반 3Mbps, 고화질 5Mbps, 초고화질 10Mbps예요.
Link_SetBitrate(UINT Bitrate)로 동적으로 조절할 수 있고, 이용자 네트워크 환경(Wi-Fi / 5G·LTE)에 따라 게임에서 자동 전환하도록 설계하면 좋아요.
비트레이트 변경은 인코더 재설정을 동반하므로 너무 자주 호출하지 않는 것을 권장해요.
Q7. 게임 알림(SendGameNotify)은 푸시 권한과 어떤 관계인가요?
A. 스토브 앱의 푸시 수신을 OFF로 두어도 알림 메시지는 앱 내 알림함에서 확인 가능해요.
다만 이용자가 스토브 계정 차원의 알림을 비활성화한 경우 -4046(User notification is inactive)이 반환돼요.
integrationKey가 파트너스에 등록된 alarm key와 매칭되어 있는지, 등록된 언어 코드(ko / zh-tw / en 등)에 해당 메시지가 등록되어 있는지도 함께 확인해주세요.
Q8. 한 계정으로 여러 모바일 기기에서 동시에 스트리밍할 수 있나요?
A. 한 계정은 여러 모바일 기기에서 스트리밍 실행/종료 자체는 가능하지만, 동일한 게임을 하나의 모바일 기기에서만 동시에 플레이할 수 있어요.
중복 스트리밍은 불가능하며, 캐릭터 단위가 아닌 계정 단위로 실행돼요.
Q9. v2에서 v3로 마이그레이션할 때 무엇을 바꿔야 하나요?
A. STOVELINK는 LINKSDK의 Alias로 지정되어 있어, 기존 #include "STOVELINKSdk.h"와 STOVELINK 네임스페이스 호출 코드는 대부분 그대로 컴파일돼요.
다만 .uproject 파일과 *.Build.cs 파일 내 의존성 참조는 STOVELINK에서 PixelStreaming으로 반드시 업데이트해야 해요.
Plugin Name과 모듈 의존성을 모두 변경한 후 프로젝트를 재빌드해주세요.
Q10. Sandbox와 Live 환경은 어떻게 분리해서 테스트하나요?
A. Sandbox는 스마일게이트 사내망에서만 접근 가능한 PC 클라이언트와 스토브 앱을 사용해요.
Live 환경 테스트는 정식 스토브 PC 클라이언트와 스토브 앱을 사용하며, iOS는 TestFlight를 통해 베타 앱을 설치하고 Android는 별도 APK 다운로드 페이지에서 설치해요.
화이트리스트 등록은 SGP 담당자에게 사전 요청이 필요해요.



직접 문의하고 싶으신가요? stove.developers@smilegate.com