This page was machine-translated from Korean. View the Korean original →

← Blog
DevlogArcade

[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

  1. (Most recommended) Save the token in the ArcadeSdk.DevToken entry of EditorPrefs.
  2. 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 }

Keep reading