Изучение методов получения правильного номера сцены в Unity

В Unity управление сценами — важная часть разработки игр. Часто возникает необходимость программно получить номер сцены для различных целей, таких как продвижение по уровню, переходы между сценами или сохранение/загрузка хода игры. В этой статье мы рассмотрим несколько методов получения правильного номера сцены в Unity, а также приведем примеры кода для каждого подхода.

Метод 1: использование SceneManager.GetActiveScene().buildIndex
Класс SceneManager в Unity предоставляет метод GetActiveScene(), который возвращает активную сцену как объект сцены. Обращаясь к свойству buildIndex объекта Scene, мы можем получить номер сцены.

using UnityEngine.SceneManagement;
int sceneNumber = SceneManager.GetActiveScene().buildIndex;
Debug.Log("Scene Number: " + sceneNumber);

Метод 2: сравнение Scene.name с SceneManager.GetSceneByBuildIndex().name
В качестве альтернативы мы можем сопоставить имя активной сцены с именами всех сцен в настройках сборки. Этот метод полезен, когда имена сцен более значимы или описательны, чем их индексы сборки.

using UnityEngine.SceneManagement;
Scene activeScene = SceneManager.GetActiveScene();
int sceneNumber = -1;
for (int i = 0; i < SceneManager.sceneCountInBuildSettings; i++)
{
    Scene scene = SceneManager.GetSceneByBuildIndex(i);
    if (scene.name == activeScene.name)
    {
        sceneNumber = i;
        break;
    }
}
Debug.Log("Scene Number: " + sceneNumber);

Метод 3: использование события AsyncOperation.completed
Если вы загружаете сцены асинхронно, вы можете использовать класс AsyncOperation для получения номера сцены после завершения загрузки.

using UnityEngine.SceneManagement;
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneName");
asyncLoad.completed += operation =>
{
    int sceneNumber = SceneManager.GetSceneByName("SceneName").buildIndex;
    Debug.Log("Scene Number: " + sceneNumber);
};

Метод 4: собственный сценарий управления сценой.
Вы можете создать собственный сценарий для управления сценами в вашей игре. Этот скрипт может отслеживать номера сцен и предоставлять общедоступный метод для получения текущего номера сцены.

using UnityEngine;
public class SceneManagement : MonoBehaviour
{
    public static SceneManagement instance;
    public int currentSceneNumber;
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else
        {
            Destroy(gameObject);
        }
    }
    public int GetCurrentSceneNumber()
    {
        return currentSceneNumber;
    }
}

Чтобы получить доступ к текущему номеру сцены из любого другого скрипта, вы можете использовать следующий код:

int sceneNumber = SceneManagement.instance.GetCurrentSceneNumber();
Debug.Log("Scene Number: " + sceneNumber);

В этой статье мы рассмотрели различные методы получения правильного номера сцены в Unity. Независимо от того, предпочитаете ли вы использовать класс SceneManager, сравнивать имена сцен, использовать асинхронную загрузку или реализовывать собственный сценарий управления сценой, эти подходы позволят вам получить программный доступ к номеру сцены для широкого спектра сценариев разработки игр.