Scene Data
As implementações de ISceneData
são usadas internamente pelo Core Scene Manager para vincular uma cena carregada com sua ILoadSceneInfo
de origem e sua IAsyncSceneOperation
.
Essas informações são usadas principalmente para lidar corretamente com operações Addressable, mas também são utilizadas no fluxo não-addressable.
Interface ISceneData
A interface ISceneData
define:
public interface ISceneData
{
IAsyncSceneOperation AsyncOperation { get; }
ILoadSceneInfo LoadSceneInfo { get; }
Scene SceneReference { get; }
void SetSceneReferenceManually(Scene scene);
void UpdateSceneReference();
bool MatchesLoadSceneInfo(ILoadSceneInfo loadSceneInfo);
IAsyncSceneOperation LoadSceneAsync();
IAsyncSceneOperation UnloadSceneAsync();
}
Ela mantém uma referência ao ILoadSceneInfo
usado para carregar a cena, a referência da cena e uma IAsyncSceneOperation
que pode se referir tanto à operação de carregamento quanto de descarregamento, dependendo do estado da cena.
Quando as primeiras cenas são adicionadas ao CoreSceneManager
durante seu construtor, elas são associadas a um LoadSceneInfoScene
como seu ILoadSceneInfo
.
Os métodos SetSceneReferenceManually()
e UpdateSceneReference()
são usados pelos fluxos não-addressable e addressable, respectivamente.
O primeiro é utilizado para atribuir manualmente qual cena foi carregada pelo fluxo padrão, já que isso não é exposto pelos métodos do SceneManager
da Unity.
O segundo atualiza a referência da cena com base no resultado da IAsyncSceneOperation
, já que o fluxo addressable retorna qual cena foi carregada.
Por fim, o ISceneData
também define os métodos LoadSceneAsync
e UnloadSceneAsync
, que internamente chamam as APIs do SceneManager
ou dos Addressables
, dependendo de sua implementação.
Existem apenas duas implementações de ISceneData
: SceneDataStandard
e SceneDataAddressable
.
Criando uma instância de Scene Data
Como o tipo de Scene Data depende do tipo de ILoadSceneInfo
, ele é criado por meio de uma classe auxiliar: SceneDataBuilder
.
public static class SceneDataBuilder
{
public static ISceneData BuildFromLoadSceneInfo(ILoadSceneInfo sourceLoadSceneInfo);
public static ISceneData BuildFromScene(Scene scene);
}
Construir a partir de ILoadSceneInfo
gerará:
Construir a partir de uma cena carregada sempre retornará um LoadSceneInfoScene
, já que é a referência de cena mais confiável.
Operando com Scene Data
O CoreSceneManager
opera com Scene Data internamente para armazenar em cache as cenas carregadas e orquestrar as Operações de Cena.
Como algumas operações de Scene Data não estão diretamente relacionadas ao CoreSceneManager
, seu uso é implementado em uma classe utilitária: SceneDataUtilities
.
public static class SceneDataUtilities
{
public static void LinkLoadedScenesWithSceneDataArray(ISceneData[] sceneDataArray, IList<ISceneData> sceneDatasToExclude);
public static ISceneData[] GetLoadedSceneDatasWithLoadSceneInfos(ILoadSceneInfo[] sourceSceneInfos, IList<ISceneData> loadedSceneDataList);
public static Scene[] GetScenesFromSceneDataArray(ISceneData[] sceneDataArray);
public static float GetAverageSceneLoadOperationProgress(ISceneData[] sceneDataArray);
public static bool TryLinkLoadedSceneWithSceneData(Scene scene, IList<ISceneData> sceneDataList, out ISceneData matchedData);
public static bool TryGetSceneDataByLoadSceneInfo(ILoadSceneInfo loadSceneInfo, IEnumerable<ISceneData> sceneDataList, out ISceneData sceneData);
public static bool TryGetSceneDataByLoadedScene(Scene scene, ICollection<ISceneData> sceneDataList, out ISceneData sceneData);
public static bool HasCompletedAllSceneLoadOperations(ISceneData[] sceneDataArray);
}
Você pode usar essa classe e a implementação do CoreSceneManager
como referência para personalizar seu uso, se necessário.