シーン

このページは自動翻訳されており、誤りが含まれる場合があります。誤りを見つけた場合は「このページを編集」リンクからご協力ください。

シーンはノードツリーを持つ .prefab ファイルです(シーンとシーンノード を参照)。ビルドしたゲームは Player Settings で指定したスタートアップシーンを開き、そこから先はスクリプトがシーンマネージャーを通して残りを読み込みます。

シーンマネージャーの取得

ISceneManager? scenes;

public override void OnAwake() => scenes = RuntimeServices.TryGet<ISceneManager>();

同じコードが Studio の Play Mode でもエクスポートしたゲームでも動きます。

フィールドとしてのシーン参照

シーンをアセット参照として公開し、Inspector で選びます:

public class LevelExit : Component
{
    public AssetReference<Prefab>? NextLevel;
}

読み込みモード

// 読み込み済みのすべてのシーンを次のステージに置き換える。
await scenes.LoadSceneAsync(NextLevel!.AssetId, LoadSceneMode.Single);

// 現在のシーンに追加する — HUD、ストリーミングするエリア、デバッグ表示など。
var hud = await scenes.LoadSceneAsync(hudScene.AssetId, LoadSceneMode.Additive);
モード 効果
LoadSceneMode.Single 読み込み済みのすべてのシーンを破棄してから新しいシーンを読み込みます。
LoadSceneMode.Additive 読み込み済みのシーンを残して新しいシーンを追加します。

LoadSceneAsync は AssetId、Name、RootNode を持つ LoadedScene を返します。シーンファイルはバックグラウンドタスクで読み込まれ、返されたタスクはシーンが登録されて更新の準備ができた時点で完了します。

アクティブなシーン

読み込み済みのシーンのうち 1 つがアクティブです。親を指定しない InstantiateAsync(prefab) は、コピーをアクティブなシーンのルートに追加します。

scenes.SetActiveScene(hud);            // または SetActiveScene(assetId)
var current = scenes.ActiveScene;
foreach (var scene in scenes.LoadedScenes) Log.Logger.LogInformation("{Scene}", scene.Name);

破棄

scenes.UnloadScene(hud);               // LoadedScene で
scenes.UnloadScene(hudScene.AssetId);  // アセット id で
scenes.UnloadAllScenes();

破棄するとシーンのコンポーネントで OnDisable と OnDestroy が実行されます。

同じシーンを 2 回読み込む

DuplicateLoadPolicy は、既に読み込まれたシーンが再び要求されたときの動作を決めます:

ポリシー 効果
ReuseExisting(既定) 読み込み済みのシーンを返します。
Allow 独立したもう 1 つのコピーを読み込みます。
Reject 例外を投げます。

シーン切り替えをまたいで残るオブジェクト

scenes.PersistentRoot は決して破棄されず、読み込み済みのシーンと一緒に毎フレーム更新されるノードです — Unity の DontDestroyOnLoad に相当します。音楽プレイヤーやセーブ管理などはこの下に置きます:

var musicPlayer = await scenes.InstantiateAsync(musicPrefab, scenes.PersistentRoot);

例:時間でステージを切り替える

public class SceneSwitcher : Component
{
    public AssetReference<Prefab>? Next;
    public float Seconds = 5f;

    ISceneManager? scenes;
    float elapsed;
    bool loading;

    public override void OnAwake() => scenes = RuntimeServices.TryGet<ISceneManager>();

    public override void OnUpdate(float deltaTime)
    {
        if (loading || Next is null || scenes is null) return;

        elapsed += deltaTime;
        if (elapsed < Seconds) return;

        loading = true;
        _ = scenes.LoadSceneAsync(Next.AssetId, LoadSceneMode.Single);
    }
}

← すべてのドキュメント このページを編集