A SmartScene é uma biblioteca para Unity que facilita o gerenciamento de cenas, permitindo agrupar cenas em "Scene Groups" e carregá-las de forma assíncrona. Ela é ideal para projetos que exigem carregamento dinâmico de cenas, como jogos com múltiplas fases, interfaces de usuário complexas ou sistemas de carregamento progressivo.
- Abra o Unity e navegue até o Package Manager:
- No menu superior, clique em
Window > Package Manager.
-
No Package Manager, clique no botão "+" no canto superior esquerdo e selecione "Add package from git URL...".
-
Insira o seguinte Git URL:
https://github.com/Louiixx-h/smart-scene-unity-library.git -
Clique em "Add". O Unity baixará e importará automaticamente a biblioteca SmartScene para o seu projeto.
-
Aguarde o processo de importação ser concluído. A biblioteca estará pronta para uso!
Um Scene Group é uma lista de cenas que podem ser carregadas juntas. Para criar um, use o SceneGroupDataSo (ScriptableObject).
- No Unity, clique com o botão direito no Project Window e selecione
Create > SmartScene > SceneGroupDataSo. - Nomeie o arquivo (por exemplo,
InitialSceneGroup). - No Inspector, defina o nome do grupo e a lista de cenas.
Para usar os dados de um SceneGroupDataSO no SceneConfig, você pode acessar o método GetData() do SceneGroupDataSO. Aqui está um exemplo:
// Suponha que você tenha uma referência ao SceneGroupDataSO
[SerializeField] private SceneGroupDataSo sceneGroupDataSo;
// Crie um SceneConfig usando o SceneGroupDataSO
var sceneConfig = new SceneConfig.SceneConfigBuilder()
.SetSceneGroup(sceneGroupDataSo.GetData()) // Obtém os dados do SceneGroupDataSO
.SetProgress(new Progress<float>(progress => Debug.Log($"Progress: {progress * 100}%")))
.SetIgnoreIfAlreadyLoaded(true)
.Build();sceneGroupDataSo.GetData(): Retorna oSceneGroupData(struct) armazenado noSceneGroupDataSO.SetSceneGroup: Define o grupo de cenas a ser carregado.SetProgress: Define um objeto para reportar o progresso do carregamento.SetIgnoreIfAlreadyLoaded: Ignora cenas já carregadas, se necessário.
O GameManager é responsável por iniciar o carregamento das cenas e gerenciar os eventos de carregamento. Aqui está um exemplo de implementação:
using Com.LuisLabs.SmartScene;
using UnityEngine;
public class GameManager : PersistentSingleton<GameManager>
{
[SerializeField] private SceneGroupDataSo initialSceneGroupData; // Referência ao ScriptableObject no Inspector
private ISmartSceneManagement _smartSceneManagement;
protected override void Awake()
{
base.Awake();
_smartSceneManagement = GetComponent<SmartSceneManagement>(); // Obtém o gerenciador de cenas
}
private void Start()
{
// Carrega o grupo de cenas inicial
SwitchSceneGroup(initialSceneGroupData);
}
private void OnEnable()
{
// Inscreve-se nos eventos de carregamento
_smartSceneManagement.OnLoadingStart += OnLoadingStart;
_smartSceneManagement.OnLoadingEnd += OnLoadingEnd;
}
private void OnDisable()
{
// Remove a inscrição nos eventos de carregamento
_smartSceneManagement.OnLoadingStart -= OnLoadingStart;
_smartSceneManagement.OnLoadingEnd -= OnLoadingEnd;
}
/// <summary>
/// Troca para um novo grupo de cenas.
/// </summary>
/// <param name="sceneGroupData">O ScriptableObject contendo o grupo de cenas.</param>
public void SwitchSceneGroup(SceneGroupDataSo sceneGroupData)
{
var sceneConfig = new SceneConfig.SceneConfigBuilder()
.SetSceneGroup(sceneGroupData.GetData()) // Obtém os dados do grupo de cenas
.Build();
// Inicia o carregamento assíncrono
StartCoroutine(_smartSceneManagement.SwitchSceneGroupAsync(sceneConfig));
}
private void OnLoadingStart()
{
Debug.Log("Loading started"); // Log quando o carregamento começa
}
private void OnLoadingEnd()
{
Debug.Log("Loading ended"); // Log quando o carregamento termina
}
}- PersistentSingleton: Garante que o
GameManagerpersista entre cenas e tenha apenas uma instância. - SceneGroupDataSo: Referência ao ScriptableObject que contém o grupo de cenas inicial.
- SwitchSceneGroup: Método para trocar o grupo de cenas ativo.
- Eventos de Carregamento:
OnLoadingStarteOnLoadingEndsão usados para notificar o início e o fim do carregamento.
Adicione o componente SmartSceneManagement ao mesmo GameObject que contém o GameManager. Isso permitirá que o GameManager acesse e controle o carregamento de cenas.
- Crie um
SceneGroupDataSono Unity (como explicado na seção 3). - Defina as cenas que devem ser carregadas no grupo (por exemplo,
MainMenu,UI,Logic). - Arraste o
SceneGroupDataSocriado para o campoinitialSceneGroupDatano Inspector doGameManager.
Ao iniciar o jogo, o GameManager carregará automaticamente o grupo de cenas definido em initialSceneGroupData. Você verá logs no console indicando o início e o fim do carregamento.
Exemplos e Tutoriais Para um exemplo completo de como usar a biblioteca SmartScene, confira o repositório de Sample:
🔗 Smart Scene Unity Library Sample
O repositório de Sample contém um projeto Unity funcional que demonstra como configurar e usar a biblioteca em um cenário real. Siga as instruções no README.md do repositório para começar.
-
Propriedades:
CurrentSceneGroup: Grupo de cenas atualmente carregadas.CurrentPersistentSceneGroup: Grupo de cenas persistentes carregadas.ActiveScene: Cena ativa no momento.SceneCount: Número de cenas carregadas.OnLoadingStart: Evento disparado ao iniciar o carregamento.OnLoadingEnd: Evento disparado ao finalizar o carregamento.
-
Métodos:
SwitchSceneGroupAsync(SceneConfig): Troca para um novo grupo de cenas.LoadSceneToCurrentGroupAsync(SceneConfig): Adiciona cenas ao grupo atual.LoadPersistentSceneAsync(SceneConfig): Carrega cenas persistentes.UnloadSceneAsync(string): Descarrega uma cena do grupo atual.UnloadPersistentSceneAsync(string): Descarrega uma cena persistente.GetSceneAt(int): Retorna a cena no índice especificado.
-
Propriedades:
Progress: Objeto para reportar o progresso do carregamento.SceneGroup: Grupo de cenas a serem carregadas.IgnoreIfAlreadyLoaded: Ignora cenas já carregadas.
-
Builder:
SetSceneGroup(SceneGroupData): Define o grupo de cenas.SetProgress(IProgress<float>): Define o objeto de progresso.SetIgnoreIfAlreadyLoaded(bool): Define se cenas já carregadas devem ser ignoradas.Build(): Constrói o objetoSceneConfig.
- Métodos:
GetData(): Retorna oSceneGroupDataarmazenado no ScriptableObject.
Aqui está um exemplo completo de como usar a biblioteca com o GameManager:
- Crie um
SceneGroupDataSochamadoInitialSceneGroupe defina as cenasMainMenu,UIeLogic. - Adicione o
GameManagere oSmartSceneManagementa um GameObject na cena. - Arraste o
InitialSceneGrouppara o campoinitialSceneGroupDatano Inspector doGameManager. - Execute o projeto. O grupo de cenas será carregado automaticamente, e você verá logs no console indicando o progresso.
Se você quiser contribuir para o projeto, sinta-se à vontade para abrir uma issue ou enviar um pull request. Todas as contribuições são bem-vindas!
Este projeto está licenciado sob a licença MIT. Consulte o arquivo LICENSE para mais detalhes.