Как загрузить сцену на основе имени родительского игрового объекта сценария?

#c# #unity3d

Вопрос:

Я пытаюсь создать систему загрузки уровней в unity, которая будет загружать уровень на основе кнопки, которую вы нажмете. Код, который у меня сейчас есть, крайне не нужен, так как мне нужно создать IEnumerator и функцию StartCoroutine для каждой отдельной кнопки.

Это код, который у меня есть до сих пор:

     public void LoadLevel1()
    {
        StartCoroutine(Level1());
    }

    IEnumerator Level1()
    {
        transition.SetTrigger("Start");

        yield return new WaitForSeconds(2);

        SceneManager.LoadScene("Level 1");
    }

 

Этот процесс для каждого уровня становится действительно раздражающим и повторяющимся, так как 10 уровней уже занимают более 150 строк беспорядочного кода.

Я попытался оптимизировать это, загрузив сцену с названием кнопки.

Например, на кнопке, которая загружает уровень 1, название кнопки называется «Уровень 1», поэтому логически я бы просто назвал «gameObject.name» и возьмите название кнопки «Уровень 1» и загрузите сцену «Уровень 1».

У Visual Studio нет проблем с этим, но когда я пытаюсь запустить приведенный ниже код:

     public void LoadLevel()
    {
        StartCoroutine(GoToLevel());
    }

    IEnumerator GoToLevel()
    {
        transition.SetTrigger("Start");

        yield return new WaitForSeconds(2);

        SceneManager.LoadScene(gameObject.name);
    }
 

Но по какой-то причине единство требует gameObject.name и говорит: «О, вам нужно имя вашего родителя» и пытается загрузить сцену «Уровень загрузки». Которого не существует, потому что он должен загружать «Уровень 1». Я понятия не имею, почему это происходит. Любые идеи будут оценены по достоинству.

Комментарии:

1. Кнопки, которые будут загружать игру, будут статичными (например, стандартные 10 кнопок) или они будут загружаться динамически?

Ответ №1:

gameObject.name возьмите значение из gameobject, в который вы добавили свой скрипт. Вы должны пройти btn gameobject.name и это будет работать нормально. В качестве альтернативы вы можете добавить аргумент в функцию с int и передать индекс уровня следующим образом :

 public void LoadLevel(int i)
{
    StartCoroutine(GoToLevel(i));
}

IEnumerator GoToLevel(int i)
{
    transition.SetTrigger("Start");

    yield return new WaitForSeconds(2);

    SceneManager.LoadScene("Level"   i);
}
 

Вызовите эту функцию уровня загрузки из btn и передайте номер уровня в качестве аргумента в инспекторе, и все готово. И обязательно сохраняйте название сцены как Level1, Level2 ….