コンテンツにスキップ

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 コンポーネントを配置する”
  1. IGPBootstrap などの空オブジェクトを作成する
  2. 次のコンポーネントを追加する
    • IGPRuntimeManager
    • IGPQuickstartDriver
  3. IGPQuickstartDriver.runtimeManager に同じオブジェクト上の IGPRuntimeManager を割り当てる
  4. シーン遷移後も切断したくない場合は、このオブジェクトを破棄しないようにし、IGPRuntimeManager が 1 つだけになるようにする

IGPRuntimeManager を追加すると、SDK はプロジェクト内の IGPConfig を自動で割り当てます。まだ存在しない場合は、Assets/IGP/IGPConfig.asset を自動作成します。

IGPConfig に IGP 運営から受け取った appId を設定します。

SDK は、シーンに IGPRuntimeManager があるだけでは起動しません。ゲーム側の起動フローから InitializeAsync() を呼び出してください。

今回の接続目的に合わせて検証パスを選んでください。

4.1 シングルプレイ / ルームなし接続

Section titled “4.1 シングルプレイ / ルームなし接続”

ゲーム認可、実績、その他のルーム非依存のデスクトップ機能だけを接続する場合は、Unity デバッグ の「デスクトップクライアント機能のみ」を先に確認してください。

最低限、次が見えることを目標にします。

  1. InitializeAsync() が成功する
  2. Unlock Achievement または Report Achievement Progress を手動実行した後に成功ログが出る

このパスでは、ルーム作成、マップ選択、ready、realtime、KCP は不要です。

4.2 マルチプレイヤー / ルーム接続

Section titled “4.2 マルチプレイヤー / ルーム接続”

ルーム、realtime、state、RPC、Mirror Transport、KCP、実行中のマップ変更を接続する場合は、Unity デバッグ の「完全なホスト型ルームフロー」を確認してください。

最低限、次が見えることを目標にします。

  1. Joined room ログ
  2. Local player marked ready ログ
  3. 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 を起動します。PRODPREVIEW では、対応する公式の信頼済みデスクトップクライアントだけを起動します。Desktop Launch CommandINDIEGP_DESKTOP_PATH による明示指定は DEV のデバッグ用途です。

設定後に、次を手動で実行します。

  • Unlock Achievement
  • Report Achievement Progress

受け入れ条件は接続目的ごとに分けて考えてください。

シングルプレイ / ルームなし接続

Section titled “シングルプレイ / ルームなし接続”
  1. appId が設定されている
  2. InitializeAsync() が成功する
  3. ゲーム認可または実績呼び出しが期待どおりの結果を返す

マルチプレイヤー / ルーム接続

Section titled “マルチプレイヤー / ルーム接続”
  1. ログに Joined room が出る
  2. ログに Local player marked ready が出る
  3. Send Quickstart Message 実行後に送信ログが出る

任意: デスクトップ機能の追加確認

Section titled “任意: デスクトップ機能の追加確認”
  1. Unlock Achievement 実行後に成功ログが出る
  2. あるいは Report Achievement Progress 実行後に成功ログが出る

Quick Start が完了したら、対象機能に応じて次へ進んでください。