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

  1. Em Unity, vá para File > New Scene para criar uma nova cena. Salve-a na sua pasta Assets, nomeando-a Scene1.
  2. Repita o processo para criar outra cena chamada Scene2.
  3. Adicione ambas as cenas às configurações de compilação acessando Arquivo > Configurações de compilação e clicando em Adicionar cenas abertas.

Designando pontos de teletransporte

Cada cena precisa de um ponto designado onde o jogador aparecerá após o teletransporte.

  1. Em Scene1, crie um GameObject vazio e nomeie-o como TeleportPoint1. Marque-o apropriadamente, por exemplo, como SpawnPoint.
  2. Em Scene2, crie outro GameObject vazio chamado TeleportPoint2 e marque-o de forma semelhante.
  3. 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;
        }
    }
}
  1. Crie um novo script C# chamado Teleportation.cs na pasta Scripts.
  2. Anexe este script a um objeto que atuará como um gatilho de teletransporte, como uma porta ou portal.
  3. 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);
        }
    }
}
  1. Crie um novo script C# chamado PlayerData.cs e anexe-o ao objeto player ou a um GameObject separado.
  2. 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.