2017-02-22 34 views
2

В моей игре есть карта, содержащая сетку из 50x50. Когда вы нажимаете на плитку, вы попадаете на этот вид плитки и атакуете вещи и т. Д. Единственная разница между этими «плитами» в том, что касается кода, это идентификатор плитки, иначе. который номер на сетке. Это число будет передано серверу init для обработки остального.Загрузить сцену с переменной переменной Unity

Очевидно, что с учетом различий в плитках было бы ошибкой создавать сцену «1», сцену «2» ... сцену «2500» и вызывать SceneManager.LoadScene, чтобы переключиться на конкретный вид плитки ,

Я мог бы использовать DontDestroyOnLoad(); при нажатии на плитку, чтобы сохранить идентификатор фрагмента в переключателе сцены, но 1) он принимает только игровые объекты не только для переменной int. 2) мне не нужно/не нужно сохранять эту переменную для чего-либо большего, чем представление init в режиме просмотра. Поэтому, пока он может работать, это кажется излишним.

Есть ли более эффективная практика, по сути, просто передать параметр нагрузке на сцену?

+1

Я полагаю, вы могли бы создать статический класс, содержащий информацию, если вам не нужно разговаривать с игровыми объектами (наследовать monobehaviour). 1 сек, я приведу вам быстрый пример. – Maakep

ответ

3

Вы можете создать статический класс, который содержит информацию для вас. Этот класс не будет прикреплен к любому GameObject и не будет уничтожен при смене сцены. Это static, что означает, что может быть только ОДИН ИЗ; вы не можете написать StaticClassName scn = new StaticClassName() для создания новых статических классов. Вы обращаетесь к ним прямо через StaticClassName.SomeStaticMethod(), к примеру, и к ним можно получить доступ из любого места. Смотрите этот пример о том, как сохранить значение в переменной, изменение сцены, а затем использовать его в этой сцене:

Нормальный сценарий Unity прилагается к GameObject в Scene «Тест»:

using UnityEngine; 
public class TestingScript : MonoBehaviour { 
    void Start() 
    { 
     StaticClass.CrossSceneInformation = "Hello Scene2!"; 
     SceneManager.LoadScene("Test2"); 
    } 
} 

Новый статический класс (не унаследовав от monobehaviour), который содержит информацию о:

public static class StaticClass { 
    public static string CrossSceneInformation { get; set; } 
} 

скрипт присоединен к объекту игры в сцене "Test2":

using UnityEngine; 
public class TestingScript2: MonoBehaviour { 

    void Start() { 
     Debug.Log(StaticClass.CrossSceneInformation); 
    } 
} 

Вам не нужно, чтобы весь статический класс (если вам по какой-то причине нужно создать больше экземпляров). Если вы должны удалить static из класса (а не переменной), вы можете получить доступ к статической переменной через StaticClass.CrossSceneInformation, но вы также можете сделать StaticClass sc = new StaticClass();. С этим sc вы можете использовать нестатические элементы класса, но не static CrossSceneInformation, так как это может быть только ОДИН из этого (потому что он статический).

+1

Я обычно делаю один такой класс для каждой сцены, который нуждается в некоторой информации о контексте – Dunno

+1

Мне это очень нравится! Только то, что мне было нужно. И что вы за напоминания о том, что статично, я использовал их несколько произвольно. – DasBeasto

+0

Отлично! Рад помочь! – Maakep