Como se teletransportar entre cenas no Unity
Teleportar entre cenas em Unity é um recurso útil para a transição de jogadores entre diferentes níveis ou áreas. Este tutorial aborda como implementar o teletransporte de cena usando carregamento de cena aditivo, garantindo a persistência dos dados do jogador e descarregando a cena antiga após o teletransporte. Essa abordagem garante uma transição suave sem perder dados ou objetos do jogador.
Configurando cenas e pontos de teletransporte
Primeiro, vamos configurar as cenas e designar pontos de teletransporte dentro delas.
Criando Cenas
- Em Unity, vá para
File > New Scene
para criar uma nova cena. Salve-a na sua pastaAssets
, nomeando-aScene1
. - Repita o processo para criar outra cena chamada
Scene2
. - Adicione ambas as cenas às configurações de compilação acessando
Arquivo > Configurações de compilação
e clicando emAdicionar cenas abertas
.
Designando pontos de teletransporte
Cada cena precisa de um ponto designado onde o jogador aparecerá após o teletransporte.
- Em
Scene1
, crie um GameObject vazio e nomeie-o comoTeleportPoint1
. Marque-o apropriadamente, por exemplo, comoSpawnPoint
. - Em
Scene2
, crie outro GameObject vazio chamadoTeleportPoint2
e marque-o de forma semelhante. - Esses GameObjects servirão como locais de geração durante a transição entre cenas.
Criando um script de teletransporte
O script de teletransporte gerencia a transição de cena, garantindo que o jogador se mova para o local correto na nova cena e, em seguida, descarrega a cena anterior.
Roteiro de Teletransporte
using UnityEngine;
using UnityEngine.SceneManagement;
public class Teleportation : MonoBehaviour
{
public string sceneToLoad; // Name of the scene to load
public string spawnPointTag = "SpawnPoint"; // Tag for identifying the spawn point
private string currentSceneName; // To track the current scene
void Start()
{
currentSceneName = SceneManager.GetActiveScene().name;
}
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Player"))
{
DontDestroyOnLoad(other.gameObject); // Prevent player object from being destroyed
SceneManager.LoadScene(sceneToLoad, LoadSceneMode.Additive); // Load new scene additively
SceneManager.sceneLoaded += OnSceneLoaded; // Register callback for scene load completion
}
}
void OnSceneLoaded(Scene scene, LoadSceneMode mode)
{
if (scene.name == sceneToLoad)
{
// Find the spawn point in the newly loaded scene
GameObject spawnPoint = GameObject.FindWithTag(spawnPointTag);
if (spawnPoint != null)
{
GameObject player = GameObject.FindWithTag("Player");
if (player != null)
{
// Teleport the player to the spawn point
player.transform.position = spawnPoint.transform.position;
}
}
// Unload the previous scene
SceneManager.UnloadSceneAsync(currentSceneName);
// Update the current scene name and unregister the event handler
currentSceneName = sceneToLoad;
SceneManager.sceneLoaded -= OnSceneLoaded;
}
}
}
- Crie um novo script C# chamado
Teleportation.cs
na pastaScripts
. - Anexe este script a um objeto que atuará como um gatilho de teletransporte, como uma porta ou portal.
- Defina
sceneToLoad
como o nome da cena para a qual será feita a transição e certifique-se de que o ponto de teletransporte na nova cena esteja marcado corretamente.
Manipulando dados do jogador em cenas
Se o seu jogo exige a manutenção de dados do jogador (como inventário, saúde, etc.) em todas as cenas, implemente uma estratégia de persistência de dados.
Dados persistentes do jogador
using UnityEngine;
public class PlayerData : MonoBehaviour
{
public static PlayerData instance;
public int health = 100;
void Awake()
{
if (instance == null)
{
instance = this;
DontDestroyOnLoad(gameObject);
}
else
{
Destroy(gameObject);
}
}
}
- Crie um novo script C# chamado
PlayerData.cs
e anexe-o ao objeto player ou a um GameObject separado. - Certifique-se de que este GameObject não seja destruído durante as transições de cena usando
DontDestroyOnLoad(gameObject)
.
Conclusão
Teleportar entre cenas em Unity, especialmente com carregamento e descarregamento de cena aditivos, fornece uma experiência perfeita. Este método retém objetos importantes do jogo, como o jogador, e gerencia recursos de forma eficiente descarregando a cena anterior. Tal abordagem é particularmente útil em jogos com ambientes grandes ou contínuos. Personalize ainda mais esta configuração para atender a requisitos específicos de jogabilidade, como manter dados de estado ou adicionar efeitos visuais durante as transições.