- 마지막 업데이트
스토브링크
이해하기
스토브링크는 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 환경 변화 | 절전모드·화면 잠금·최대 절전모드에서는 스트리밍이 느려지거나 중단될 수 있음. |
| 네트워크 의존 | 실시간 데이터 전송이 필요해 네트워크 속도 부족 시 영상 끊김 또는 깨짐 발생. |
연동 가이드
연동 준비
스토브링크는 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에서 활성화
- Editor 실행 후 Edit → Plugins 메뉴 진입
- 기본 제공되는 Pixel Streaming 플러그인을 비활성화
- STOVE Streaming 플러그인을 활성화
- 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콜백에서 스토브링크 초기화를 호출해요.cppvoid AYourGameMode::HandleBaseInitialize(const FBaseInitResult& Result) { if (!Result.IsSuccessful()) return; // 스토브링크 초기화 UStoveLinkSubsystem::Link_Initialize(); }
- Blueprint 프로젝트
Blueprint 이벤트 그래프에서 다음 노드를 순서대로 연결해요.
Event Begin Play→Link 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 설치
- SDK 다운로드 페이지에서 사용 Unity 버전에 맞는
.unitypackage를 다운로드 - Unity Editor의 Assets → Import Package → Custom Package로 패키지 임포트
- 임포트 시 Input System 패키지가 이미 설치되어 있다면, 충돌 방지를 위해 기존 Input System을 먼저 제거하고 STOVELINK 패키지의 것을 사용하도록 권고
- SDK 다운로드 페이지에서 사용 Unity 버전에 맞는
- 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 Module의 Replace 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) 게임 이벤트를 모바일 앱 알림으로 전송해요. 파트너스에 사전 등록한 알림 키와 변수 매핑을 사용해요.csharpvar 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.jsonjson{ "stove_launcher_policy_config": { "enable_linkplay": true } }
- 3) LinkPlay 기능이 비활성화 처리되었다면
특정 게임에 대해 LinkPlay 노출이 비활성화된 상태라면, 이용자별
PersonalConfig.json에 게임 ID를 직접 등록해 임시 우회할 수 있어요. 수정 후 스토브 런처를 재시작해야 적용돼요.text경로: C:\Users\<UserName>\AppData\Local\STOVEGATE8\Config\<MemberNumber>\PersonalConfig.jsonjson{ "streamingGameIds": ["<GameID>"] }
- 4) 회원번호를 확인하고 싶어요
로그 파일 내 WebSocket 연결 로그에서 회원번호를 확인할 수 있어요.
예시에서
108195073이 회원번호예요. 또는 스토브 프로필 페이지에서도 확인 가능해요.text[DBG] Signaling: Connecting WS wss://stovelink-ss.gate8.com:8888/s/108195073-1
- 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.
- 5) CDN 연결 확인
로그에 다음 CDN 요청 성공 메시지가 있는지 확인해요.
해당 로그가 누락되어 있다면 방화벽 · 네트워크 설정을 점검하고, VPN/프록시 차단 여부를 확인해 주세요.
- 기능별 이슈
- 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콜백 → 스토브링크 초기화 → 콜백 등록 → 알림 송신까지 한 흐름으로 구성한 샘플이에요.
// 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);
};
// 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 기반 프로젝트에서는 다음 패턴으로 동일한 흐름을 구성할 수 있어요.
[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# — 초기화부터 부가 기능까지
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 또는 씬 전환 시점에 반드시 해제해야 메모리 누수와 중복 호출을 방지할 수 있어요.


