Pular para o conteúdo principal
Versão: 3.1.0

Guia Básico

Carregar cenas com esse pacote implica que as cenas sempre serão carregadas aditivamente. Isso porque não há vantagem em carregar cenas no modo Single quando você espera trabalhar com múltiplas cenas.

Para padronizar como as cenas são carregadas, você usará objetos ISceneLoader, ISceneManager e ILoadSceneInfo.

Essas estruturas devem ser usadas juntas. Se você não planeja usar transições de cenas, ou se tem tipos próprios awaitable, você pode usar o ISceneManager diretamente sem um ISceneLoader.

Criando seu scene loader

Para o primeiro exemplo, vamos construir um Scene Manager e um Coroutine Scene Loader:

using MyGameDevTools.SceneLoading;
// [...]

ISceneManager sceneManager = new AdvancedSceneManager();
ISceneLoader sceneLoader = new SceneLoaderCoroutine(sceneManager);

Você também pode construir um Async Scene Loader:

ISceneManager sceneManager = new SceneManager();

ISceneLoaderCoroutine coroutineSceneLoader = new SceneLoaderCoroutine(sceneManager);
// Ou
ISceneLoaderAsync asyncSceneLoader = new SceneLoaderAsync(sceneManager);
// Ou
ISceneLoaderUniTask unitaskSceneLoader = new SceneLoaderUniTask(sceneManager);
nota

É recomendado que você guarde referências a esses objetos como interfaces para reduzir o acoplamento no seu código.

Carregando cenas com ILoadSceneInfo

Você usará objetos LoadSceneInfo para referenciar tanto cenas addressable como não addressable.

Vamos considerar que você incluiu as seguintes cenas em Build Settings:

  1. Main Menu
  2. Loading

E você tem as seguintes cenas em grupos addressable:

  • Shop
  • Level 1

Você pode carregar as cenas usando os ILoadSceneInfo apropriados:

ILoadSceneInfo mainMenuSceneInfo = new LoadSceneInfoName("Main Menu");
ILoadSceneInfo loadingSceneInfo = new LoadSceneInfoIndex(1);
ILoadSceneInfo shopSceneInfo = new LoadSceneInfoAddress("Shop");
// Você deve poder pegar o Asset Reference de uma cena pelo inspector expondo um
// AssetReference em um MonoBehaviour ou ScriptableObject
ILoadSceneInfo levelSceneInfo = new LoadSceneInfoAssetReference(levelSceneAssetReference);

// Carregar a cena chama o mesmo método, independente do tipo de load scene info
sceneLoader.LoadScene(mainMenuSceneInfo);

// Ou a alternativa async
await sceneLoader.LoadSceneAsync(mainMenuSceneInfo);

Descarregando cenas

Você pode usar todos os tipos de ILoadSceneInfo da operação de carregamento com a adição do LoadSceneInfoScene, para carregar cenas não addressable utilizando a cena retornada do ISceneLoaderAsync.LoadSceneAsync.

Scene levelScene = await sceneLoader.LoadSceneAsync(new LoadSceneInfoAssetReference(levelSceneAssetReference));
ILoadSceneInfo levelSceneInfo = new LoadSceneInfoScene(levelScene);

// [...]
sceneLoader.UnloadScene(levelSceneInfo);

// Alternativa async
await sceneLoader.UnloadSceneAsync(levelSceneInfo);

Ao invés de usar o método async, você também pode se inscrever no evento ISceneManager.SceneLoaded:

sceneLoader.Manager.SceneLoaded += loadedScene => 
{
ILoadSceneInfo loadedSceneInfo = new LoadSceneInfoScene(loadedScene);
sceneLoader.UnloadScene(loadedSceneInfo);
}

Transições de Cenas

Você pode combinar objetos diferentes de Load Scene Info no método de transição:

ILoadSceneInfo stageSceneInfo = new LoadSceneInfoName("Stage 1");
ILoadSceneInfo loadingSceneInfo = new LoadSceneInfoIndex(1);

sceneLoader.TransitionToScene(stageSceneInfo, loadingSceneInfo);

// Ou a alternativa async
await sceneLoader.TransitionToSceneAsync(stageSceneInfo, loadingSceneInfo);