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
GameManager
persista 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:
OnLoadingStart
eOnLoadingEnd
sã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
SceneGroupDataSo
no Unity (como explicado na seção 3). - Defina as cenas que devem ser carregadas no grupo (por exemplo,
MainMenu
,UI
,Logic
). - Arraste o
SceneGroupDataSo
criado para o campoinitialSceneGroupData
no 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 oSceneGroupData
armazenado no ScriptableObject.
Aqui está um exemplo completo de como usar a biblioteca com o GameManager
:
- Crie um
SceneGroupDataSo
chamadoInitialSceneGroup
e defina as cenasMainMenu
,UI
eLogic
. - Adicione o
GameManager
e oSmartSceneManagement
a um GameObject na cena. - Arraste o
InitialSceneGroup
para o campoinitialSceneGroupData
no 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.