Unity Quick Start
この Quick Start は次の内容を扱います。
IGP.UnitySDKはすでにプロジェクトへ導入済み- シーンに
IGPRuntimeManagerがある - 最初に必要なのは
appIdだけ - ゲームの起動フローで
IGPRuntimeManager.InitializeAsync()を明示的に呼び出す - シングルプレイまたはルームを使わない接続では、まず デスクトップ機能(ゲーム認可 / 実績)を検証する
- マルチプレイヤー接続では、IGP デスクトップクライアントから注入される起動情報を使って ルーム参加 -> ready -> realtime を検証する
つまり、このページには デスクトップ機能 と ルームフロー の両方への入口がありますが、前提条件は同じではありません。 マルチプレイヤールームを接続しないゲームでは、ルーム作成、マップ選択、ready、realtime、KCP は不要です。 最初の目的がマルチプレイヤーフローの確認であれば、先に実績設定まで終える必要はありません。
- Unity インストール に従って
cn.indiegp.sdk.unityを導入済み - IGP 運営から
appIdを受け取っている - ローカル PC に IGP デスクトップクライアントがインストールされ、起動できる(Windows 10+)
1. 最小 bootstrap スクリプトを追加する
Section titled “1. 最小 bootstrap スクリプトを追加する”プロジェクトに Assets/Scripts/IGPQuickstartDriver.cs を作成します。
using System;using UnityEngine;using IGP.UnitySDK;using IGP.UnitySDK.Models;
public sealed class IGPQuickstartDriver : MonoBehaviour{ [SerializeField] private IGPRuntimeManager runtimeManager; [SerializeField] private string debugMessageType = "quickstart_ping"; [SerializeField] private string unlockAchievementKey = "first_session"; [SerializeField] private string progressAchievementKey = "matches_played";
private void Awake() { runtimeManager ??= FindObjectOfType<IGPRuntimeManager>(); }
private void OnEnable() { if (runtimeManager == null) { Debug.LogError("[IGP Quickstart] IGPRuntimeManager is missing."); enabled = false; return; }
runtimeManager.onRoomJoined.AddListener(HandleRoomJoined); runtimeManager.onMessageReceived.AddListener(HandleMessageReceived); runtimeManager.onError.AddListener(HandleError); }
private async void Start() { var ok = await runtimeManager.InitializeAsync(); if (!ok) { Debug.LogError("[IGP Quickstart] SDK initialization failed."); } }
private void OnDisable() { if (runtimeManager == null) return; runtimeManager.onRoomJoined.RemoveListener(HandleRoomJoined); runtimeManager.onMessageReceived.RemoveListener(HandleMessageReceived); runtimeManager.onError.RemoveListener(HandleError); }
[ContextMenu("IGP/Send Quickstart Message")] public async void SendQuickstartMessage() { if (runtimeManager == null) return; await runtimeManager.SendMessageAsync(new Message { type = debugMessageType, roomId = runtimeManager.CurrentRoomId, playerId = runtimeManager.PlayerId, reliable = true, content = new { text = "hello from quickstart", sentAt = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds(), } }); Debug.Log("[IGP Quickstart] Sent realtime message."); }
[ContextMenu("IGP/Unlock Achievement")] public async void UnlockAchievement() { if (runtimeManager == null) return; var result = await IGPSDK.UnlockAchievementAsync(runtimeManager, unlockAchievementKey); Debug.Log($"[IGP Quickstart] Unlock success={result.success}, duplicated={result.duplicated}"); }
[ContextMenu("IGP/Report Achievement Progress")] public async void ReportAchievementProgress() { if (runtimeManager == null) return; var result = await IGPSDK.ReportAchievementProgressAsync( runtimeManager, progressAchievementKey, 1, "quickstart_manual"); Debug.Log($"[IGP Quickstart] Progress success={result.success}, duplicated={result.duplicated}"); }
private async void HandleRoomJoined(Room room) { Debug.Log($"[IGP Quickstart] Joined room id={room.id}, code={room.code}"); await runtimeManager.SetReadyAsync(true); Debug.Log("[IGP Quickstart] Local player marked ready."); }
private void HandleMessageReceived(string messageType, object content) { Debug.Log($"[IGP Quickstart] Message type={messageType}, payload={content}"); }
private void HandleError(string error) { Debug.LogError($"[IGP Quickstart] Runtime error: {error}"); }}2. シーンに runtime コンポーネントを配置する
Section titled “2. シーンに runtime コンポーネントを配置する”IGPBootstrapなどの空オブジェクトを作成する- 次のコンポーネントを追加する
IGPRuntimeManagerIGPQuickstartDriver
IGPQuickstartDriver.runtimeManagerに同じオブジェクト上のIGPRuntimeManagerを割り当てる- シーン遷移後も切断したくない場合は、このオブジェクトを破棄しないようにし、
IGPRuntimeManagerが 1 つだけになるようにする
3. appId を設定する
Section titled “3. appId を設定する”IGPRuntimeManager を追加すると、SDK はプロジェクト内の IGPConfig を自動で割り当てます。まだ存在しない場合は、Assets/IGP/IGPConfig.asset を自動作成します。
IGPConfig に IGP 運営から受け取った appId を設定します。
SDK は、シーンに IGPRuntimeManager があるだけでは起動しません。ゲーム側の起動フローから InitializeAsync() を呼び出してください。
4. Editor 内で検証する
Section titled “4. Editor 内で検証する”今回の接続目的に合わせて検証パスを選んでください。
4.1 シングルプレイ / ルームなし接続
Section titled “4.1 シングルプレイ / ルームなし接続”ゲーム認可、実績、その他のルーム非依存のデスクトップ機能だけを接続する場合は、Unity デバッグ の「デスクトップクライアント機能のみ」を先に確認してください。
最低限、次が見えることを目標にします。
InitializeAsync()が成功するUnlock AchievementまたはReport Achievement Progressを手動実行した後に成功ログが出る
このパスでは、ルーム作成、マップ選択、ready、realtime、KCP は不要です。
4.2 マルチプレイヤー / ルーム接続
Section titled “4.2 マルチプレイヤー / ルーム接続”ルーム、realtime、state、RPC、Mirror Transport、KCP、実行中のマップ変更を接続する場合は、Unity デバッグ の「完全なホスト型ルームフロー」を確認してください。
最低限、次が見えることを目標にします。
Joined roomログLocal player marked readyログSend Quickstart Messageを手動実行した後の送信ログ
ここがまだ通っていない場合は、ルームの問題と実績の問題を一緒に切り分けないでください。
5. 必要な場合だけデスクトップ機能の検証を追加する
Section titled “5. 必要な場合だけデスクトップ機能の検証を追加する”Unity Editor 内でゲーム認可や実績も確認したい場合は、Unity デバッグ の「デスクトップクライアント機能のみ」の追加設定を行います。
通常は Desktop Executable Path Debug Override を入力する必要はありません。このパスが空でも、SDK は選択された環境に対応するデスクトップクライアントを起動し、Unity Editor のプロセスパスと appId をデスクトップ側へ渡します。接続を許可するかどうかはデスクトップ側の SDK デバッグ規則で判定されます。インストール済みゲーム exe の再現やローカル exe 紐付けの調査が必要な場合だけ、このパスを指定してください。その場合は、そのゲームの実際の Windows 実行ファイルパスを指定し、デスクトップクライアントのパスは指定しません。
これはデスクトップクライアントのパスではありません。SDK は SDK Environment に応じて対応するデスクトップクライアントを探します。PROD は IndieGamesPass、PREVIEW は IndieGamesPass Preview、DEV は IndieSpark を起動します。PROD と PREVIEW では、対応する公式の信頼済みデスクトップクライアントだけを起動します。Desktop Launch Command や INDIEGP_DESKTOP_PATH による明示指定は DEV のデバッグ用途です。
設定後に、次を手動で実行します。
Unlock AchievementReport Achievement Progress
6. 最低限の受け入れ条件
Section titled “6. 最低限の受け入れ条件”受け入れ条件は接続目的ごとに分けて考えてください。
シングルプレイ / ルームなし接続
Section titled “シングルプレイ / ルームなし接続”appIdが設定されているInitializeAsync()が成功する- ゲーム認可または実績呼び出しが期待どおりの結果を返す
マルチプレイヤー / ルーム接続
Section titled “マルチプレイヤー / ルーム接続”- ログに
Joined roomが出る - ログに
Local player marked readyが出る Send Quickstart Message実行後に送信ログが出る
任意: デスクトップ機能の追加確認
Section titled “任意: デスクトップ機能の追加確認”Unlock Achievement実行後に成功ログが出る- あるいは
Report Achievement Progress実行後に成功ログが出る
7. 次のステップ
Section titled “7. 次のステップ”Quick Start が完了したら、対象機能に応じて次へ進んでください。
- 機能別のエンジンサンプル: 機能別に SDK を使う
- 基本起動フロー: 起動と接続
- ゲーム認可: ゲーム認可
- 実績: 実績
- マルチプレイヤーロビー: マルチプレイヤーロビー
- 最小コード例: メインパッケージ samples の
StarterDemo - 総合手動プレイグラウンド: メインパッケージ samples の
HostedPlayground - すでに Mirror を使っている場合: Mirror transport
- リリース前チェック: テスト