Как телепортироваться между сценами в Unity
Телепортация между сценами в Unity — полезная функция для перемещения игроков между различными уровнями или областями. В этом руководстве рассматривается, как реализовать телепортацию сцен с помощью аддитивной загрузки сцен, обеспечения сохранения данных игрока и выгрузки старой сцены после телепортации. Такой подход обеспечивает плавный переход без потери данных игрока или объектов.
Настройка сцен и точек телепортации
Сначала мы настроим сцены и обозначим точки телепортации внутри них.
Создание сцен
- В Unity перейдите в
File > New Scene
, чтобы создать новую сцену. Сохраните ее в папкеAssets
, назвав ееScene1
. - Повторите процесс, чтобы создать еще одну сцену с именем
Scene2
. - Добавьте обе сцены в настройки сборки, перейдя в
Файл > Настройки сборки
и нажавДобавить открытые сцены
.
Обозначение точек телепортации
Для каждой сцены необходимо обозначить точку, в которой игрок окажется после телепортации.
- В
Scene1
создайте пустой GameObject и назовите егоTeleportPoint1
. Пометьте его соответствующим образом, например, какSpawnPoint
. - В
Scene2
создайте еще один пустой GameObject с именемTeleportPoint2
и пометьте его аналогичным образом. - Эти игровые объекты будут служить точками появления при переходе между сценами.
Создание сценария телепортации
Скрипт телепортации управляет переходом между сценами, гарантируя, что игрок переместится в правильное место в новой сцене, а затем выгружает предыдущую сцену.
Скрипт телепортации
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;
}
}
}
- Создайте новый скрипт C# с именем
Teleportation.cs
в папкеScripts
. - Прикрепите этот скрипт к объекту, который будет действовать как триггер телепортации, например, к двери или порталу.
- Установите
sceneToLoad
на имя сцены, к которой нужно перейти, и убедитесь, что точка телепортации в новой сцене помечена правильно.
Обработка данных игрока в разных сценах
Если ваша игра требует сохранения данных игрока (например, инвентаря, здоровья и т. д.) на всех сценах, реализуйте стратегию сохранения данных.
Постоянные данные игрока
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);
}
}
}
- Создайте новый скрипт C# с именем
PlayerData.cs
и прикрепите его к объекту игрока или отдельному игровому объекту. - Убедитесь, что этот игровой объект не будет уничтожен во время переходов между сценами, используя
DontDestroyOnLoad(gameObject)
.
Заключение
Телепортация между сценами в Unity, особенно с аддитивной загрузкой и выгрузкой сцен, обеспечивает плавный опыт. Этот метод сохраняет важные игровые объекты, такие как игрок, и эффективно управляет ресурсами, выгружая предыдущую сцену. Такой подход особенно полезен в играх с большими или непрерывными средами. Настройте эту настройку далее в соответствии с конкретными требованиями игрового процесса, такими как сохранение данных о состоянии или добавление визуальных эффектов во время переходов.