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