Готовый перевод C# Game Programming Cookbook for Unity 3D / Программирование игр на Unity 3D C#. Книга готовых решений.: 2.2.2.1 Разбор скрипта
Любой скрипт может потребовать смены сцен, меню, игровых контроллеров, или обучающие контроллеры могут легко перемещаться между разделами игры не имея при этом жестко закодированных в них имен.
Менеджер уровней также может быть хорошим местом для вызова показа загрузочных экранов, осуществлять переходы между сценами (например, замирания аудиовходов / выходов или анимации), или начать загрузку сцены из удаленного местоположения.
Обратите внимание, что в функции Start () класса (как показано ниже), мы используем DontDestroyOnLoad сохранить этот скрипт и его GameObject живым даже тогда, когда новые сцены загружаются. Это означает, что мы должны предотвратить создание менеджеров дубликатов сцены, однако мы можем легко использовать GameObject.Find чтобы посмотреть на менеджера сцены GameObject перед создания экземпляра нового.
public class SceneManager : MonoBehavior
{
public string[] levelNames;
public int gameLevelNum;
public void Start ()
{
// keep this object alive
DontDestroyOnLoad (this.gameObject);
}
Скрипт SceneManager.cs обеспечивает функцию загрузки сцены в своей простейшей форме.
Здесь Application.LoadLevel используется для загрузки сцены:
public void LoadLevel( string sceneName )
{ Application.LoadLevel( sceneName );
}
Вдобавок к простой загрузки сцены, класс имеет поддержку базового прогрессивного уровня формата загрузки игры. Массив с именем levelNames держит строки, относящиеся к именам каждого из уровней в игре. Мы используем целочисленную (integer) переменную с именем gameLevelNum для обозначения какой уровень игрок находится, когда GoNextLevel () вызывается, мы делаем быструю проверку, чтобы убедиться, что gameLevelNum находится в пределах зоны:
public void GoNextLevel()
{
// if our index goes over the total number of levels in the
// array, we reset it
if( gameLevelNum >= levelNames.Length )
gameLevelNum = 0;
Затем, еще один вариант функции LoadLevel (объявленные после этой части) вызывает начало загрузки следующей сцены в зависимости от количества индексов. Наконец, gameLevelNum увеличивается, готовы до следующего раза. Обратите внимание, что добавка происходит после загрузки, а не раньше. Хотя мы и могли бы закончить это по другому, у нас есть незначительные неудобства с этим способом - значения gameLevelNum всегда будут на шаг впереди(см. в коде), не забывайте про это, если когда-либо попытаетесь получить доступ к его значениям из других классов. С другой стороны, путем увеличения gameLevelNum после загрузки, мы используем GoNextLevel с самого начала игры, чтобы загрузить первый уровень в массиве, сохраняя код последовательным в загрузках уровней:
// load the level (the array index starts at 0, but we start // counting game levels at 1 for clarity’s sake)
LoadLevel( gameLevelNum );
// increase our game level index counter
gameLevelNum++;
}
Этот альтернативный вариант функции LoadLevel показано ниже использует индекс, чтобы получить имя уровня из массива levelNames. Затем он использует оригинальную функцию LoadLevel объявленный ранее для обработки загрузки. Опять же, сохраняя фокус на одной функции для всех загрузок и избегая дублирования кода или имеющихся загрузок происходящих в более чем одном месте:
private void LoadLevel( int indexNum )
{
// load the game level
LoadLevel( levelNames[indexNum] );
}
Последняя функция в классе менеджера сцены используется для обнуления gameLevelNum всякий раз, когда мы начинаем новую игру. Предполагается, что скрипт перезапуска игры будет вызывать эту функцию перед вызовом GoNextLevel () снова.
public void ResetGame()
{
// reset the level index counter
gameLevelNum = 0;
}
}
Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод
Переведено на Нотабеноиде
http://notabenoid.org/book/55263/242439
Переводчики: ilia1395, Zeke0028
Настройки
Готово:
