This page was machine-translated from Korean. View the Korean original →
← Blog[Arcade Development Log] Integrating Arcade backend to start LiveOps
Learn how to integrate ArcadeSdk into your game to introduce various features for LiveOps.
If you haven't read the previous post yet, why not take a quick look? 👉 Previous Post
How to use Legacy API
The Legacy API provides anonymous global leaderboards and dynamic JSON features. While it has the advantage of not requiring an account for gameplay, we recommend SDK v2 if you are integrating it for the first time.
Generate Secret from Dashboard
Screenshot 2026-08-12 233659.png
Screenshot 2026-08-12 233732.png
In the game dashboard, go to LiveOps Tab > Enable LiveOps Integration > Select Legacy API > Reissue Secret to generate a secret key shared between the server and the game.
Generate ServerBridge.cs Code
Screenshot 2026-08-12 233842.png
Screenshot 2026-08-12 234104.png
Use the code generator at the bottom of the LiveOps page to create the ServerBridge.cs helper script for easy integration into your game, then add it to your Unity project.
Place in Main Scene
Screenshot 2026-08-12 234357.png
Create an empty game object in the title scene, or wherever backend functionality is first needed, and add the ServerBridge component. ServerBridge.cs uses the singleton pattern. Please note that it must be placed at the root of the hierarchy for DontDestroyOnLoad() to work correctly!
Call Singleton Instance Where Needed
Screenshot 2026-08-12 234749.png
Check the integration guide area to see how you can retrieve data from the server bridge instance.
Example: Fetching Leaderboard Data (Recoil Defense)
cs public class LeaderBoard : MonoBehaviour //리더보드 UI 코드 예제 { [SerializeField] private List leaderboardEntries;
// Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { if(leaderboardEntries == null) { Debug.LogError("Leaderboard entries list is not assigned in the inspector."); return; }
if(ServerBridge.Instance == null) //서버브릿지 인스턴스가 존재하는지 먼저 확인하세요. { Debug.LogError("ServerBridge instance is not available."); return; }
ServerBridge.Instance.GetLeaderboard("scoretop10", (success, entries) => { if (success) { Debug.Log("Leaderboard fetched successfully!"); foreach (var (entry, index) in entries.Select((value, i) => (value, i))) { leaderboardEntries[index].SetEntry(entry.rank, entry.name, entry.score); } } else { Debug.LogError("Failed to fetch leaderboard."); } }); } }
Example: Dynamic Loading of Wave Data (Recoil Defense)
cs private IEnumerator FetchServerWavesRoutine() { bool responded = false; bool ok = false; string json = null;
ServerBridge.Instance.GetConfig(serverWavesConfigKey, (success, text) => { responded = true; ok = success; json = text; });
while (!responded) { yield return null; }
if (!ok || string.IsNullOrEmpty(json)) { Debug.Log($"StageController: server waves fetch failed for key '{serverWavesConfigKey}', using local Waves."); yield break; }
WaveCollectionDto dto = JsonUtility.FromJson (json); if (dto == null || dto.Waves == null || dto.Waves.Length == 0) { Debug.LogWarning($"StageController: server waves JSON for key '{serverWavesConfigKey}' parsed to an empty wave list, using local Waves."); yield break; }
waves = Array.ConvertAll(dto.Waves, waveDto => Wave.FromDto(waveDto, ResolveEnemyPrefab)); Debug.Log($"StageController: applied {waves.Length} wave(s) from server config '{serverWavesConfigKey}'."); }
How to use SDK v2
SDK v2 uses account-based authentication to provide account-based leaderboards, dynamic JSON features, and cloud save/load functionality.
Enable SDK v2 in Dashboard
image.png
In the game dashboard, go to LiveOps Tab > Enable LiveOps Integration > Select SDK v2.
Generate Arcade SDK Code and Plugins
image.png
image.png
SDK v2 uses two files: ArcadeSdk.cs and ArcadeSdk.jslib
Add ArcadeSdk.cs anywhere in your Unity project, and add ArcadeSdk.jslib to the Assets/Plugins/WebGL/ path.
Please Note ArcadeSdk.jslib must be located inside the Assets/Plugins/WebGL/ folder.
Placement in Main Scene and Applying Development Token
image.png
Create an empty GameObject named ArcadeSdk in your Title scene (recommended) or the first scene that requires online functionality, and add the ArcadeSdk component to it.
image.png
Issue an editor development token from the LiveOps dashboard and copy the token.
image.png
- (Most recommended) Save the token in the ArcadeSdk.DevToken entry of EditorPrefs.
- Alternatively, enter the development token in the inspector field of the ArcadeSdk component. Note: Be careful, as this will be exposed if you commit it to a public repository. (In this case, you must use EditorPrefs.)
Implementation Where Needed
image.png
Check the usage example code by feature and implement it where needed.
Example: Cloud Save / Load (Land Linker)
cs /// /// 게임 데이터를 비동기로 읽습니다. WebGL과 에디터에서는 ArcadeSdk를 사용하고, /// 그 외 플랫폼에서는 기존 로컬 파일을 읽은 뒤 콜백을 즉시 호출합니다. /// public static void LoadGameDataAsync( string filePath, Action onComplete = null) { #if UNITYWEBGL || UNITYEDITOR var sdk = ArcadeSdk.Instance; if (sdk == null) { CustomDebug.LogError("[Utils.IO] ArcadeSdk 인스턴스를 찾을 수 없어 클라우드 세이브를 읽지 못했습니다."); Complete(onComplete, false, null); return; }
sdk.LoadSave(CloudSaveSlot, (ok, save) => { if (!ok || save == null || string.IsNullOrEmpty(save.data)) { CustomDebug.LogWarning("[Utils.IO] 클라우드 세이브가 없거나 읽지 못했습니다."); Complete(onComplete, false, null); return; }
try { var loadedData = JsonConvert.DeserializeObject (save.data); Complete(onComplete, loadedData != null, loadedData); } catch (Exception e) { CustomDebug.LogError($"[Utils.IO] 클라우드 세이브를 읽는 중 오류가 발생했습니다: {e.Message}"); Complete(onComplete, false, null); } }); #else var loadedData = LoadGameData(filePath); Complete(onComplete, loadedData != null, loadedData); #endif }

