Cenas

Esta página foi traduzida automaticamente e pode conter erros. Encontrou um problema? Use o link "Edit this page" para ajudar a corrigir.

Uma cena é um arquivo .prefab com uma árvore de nós (veja Cenas e nós de cena). Um jogo compilado abre a cena inicial indicada nas Player Settings; a partir daí, seus scripts carregam o resto pelo gerenciador de cenas.

Obtendo o gerenciador de cenas

ISceneManager? scenes;

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

O mesmo código funciona no Play Mode do Studio e em um jogo exportado.

Cenas como campos

Exponha uma cena como referência de asset e escolha-a no Inspector:

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

Modos de carregamento

// Substitui todas as cenas carregadas pela próxima fase.
await scenes.LoadSceneAsync(NextLevel!.AssetId, LoadSceneMode.Single);

// Soma uma cena às atuais — um HUD, uma área carregada sob demanda, uma sobreposição de depuração.
var hud = await scenes.LoadSceneAsync(hudScene.AssetId, LoadSceneMode.Additive);
Modo Efeito
LoadSceneMode.Single Descarrega todas as cenas carregadas e depois carrega a nova.
LoadSceneMode.Additive Mantém as cenas carregadas e adiciona a nova.

LoadSceneAsync retorna um LoadedScene com AssetId, Name e RootNode. Os arquivos de cena são lidos em uma tarefa de segundo plano; a tarefa retornada termina quando a cena já está registrada e pronta para atualizar.

A cena ativa

Uma das cenas carregadas é a ativa. InstantiateAsync(prefab) sem pai adiciona a cópia à raiz da cena ativa.

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

Descarregando

scenes.UnloadScene(hud);               // por LoadedScene
scenes.UnloadScene(hudScene.AssetId);  // por id do asset
scenes.UnloadAllScenes();

Descarregar executa OnDisable e OnDestroy nos componentes da cena.

Carregando a mesma cena duas vezes

DuplicateLoadPolicy decide o que acontece quando uma cena já carregada é pedida de novo:

Política Efeito
ReuseExisting (padrão) Retorna a cena já carregada.
Allow Carrega outra cópia independente.
Reject Lança uma exceção.

Objetos que sobrevivem às trocas de cena

scenes.PersistentRoot é um nó que nunca é descarregado e é atualizado a cada quadro junto com as cenas carregadas — o equivalente no Turian ao DontDestroyOnLoad da Unity. Coloque sob ele tocadores de música, gerenciadores de save e objetos parecidos:

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

Exemplo: troca de fase temporizada

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);
    }
}

← Toda a documentação Editar esta página