# Core Quickstart

```csharp
using IGP.UnitySDK;
using UnityEngine;

public sealed class IGPBootstrap : MonoBehaviour
{
    [SerializeField] private IGPRuntimeManager runtime;

    private async void Start()
    {
        runtime ??= FindObjectOfType<IGPRuntimeManager>();
        if (runtime == null || !await runtime.InitializeAsync())
        {
            Debug.LogError("IGP core initialization failed.");
        }
    }
}
```

Set `IGPConfig.hostSessionPlatform` to `Desktop` (the default) or `Mobile` before
initialization. Core owns this platform choice; optional packages such as
Multiplayer do not duplicate it. Core creates the selected internal platform
runtime during initialization; changing the config afterward does not switch a
running session.

The platform setting does not change the game-facing API. Core routes the same
profile, capability, and Multiplayer calls through the selected internal Host
Session transport.

The single initialization call initializes the selected Host path first, then
awaits every `IIGPRuntimeExtension` on the same GameObject. A core-only
installation creates no game-data socket and has no network tick.

Explicit phone sign-in and source-neutral profile APIs are the exception to the
initialization requirement: they can use Core's allowlisted Direct Curio path
before `InitializeAsync()`. See [Account And Profiles](ACCOUNT-AND-PROFILES.md).
Other Core capabilities keep their documented provider prerequisites. APIs
documented specifically as Desktop-only fail without a Desktop Host Session;
Core has no Gateway room-control prerequisite.

`RuntimeInfo` exposes host-provided values through named properties. `SaveRootPath` is always non-null and is empty when no save location is available; reading it does not create or modify the directory.

Achievement example:

```csharp
await IGPSDK.UnlockAchievementAsync(runtime, "FIRST_SESSION");
```

Multiplayer setup continues in `IGP.UnitySDK.Multiplayer/Documentation~/README.md`.
