シーン
このページは自動翻訳されており、誤りが含まれる場合があります。誤りを見つけた場合は「このページを編集」リンクからご協力ください。
シーンはノードツリーを持つ .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);
}
}