Готовый перевод C# Game Programming Cookbook for Unity 3D / Программирование игр на Unity 3D C#. Книга готовых решений.: 2.2.1.1 Разбор скрипта

Внимание! Этот перевод, возможно, ещё не готов, так как модераторы установили для него статус «идёт перевод»

Многие из ключевых функций в BaseGameController.cs являются виртуальными и включены в качестве установленного протокола для работы с различными типами игровой деятельности. То есть, они не содержат кода в данном файле, однако планируется, что вы переназначите их в свои собственные полученные версии игрового контроллера в дальнейшем.

Класс BaseGameController наследуется от MonoBehavior, так что он может задействовать автоматически называемые системные функции, такие как: Awake(), Start(), Update(), and FixedUpdate():

public class BaseGameController : MonoBehavior
{

Функции находятся здесь в качестве заполнителей. Цель состоит, что скрипты игрового контроллера будут использованы для реальных игровых проектов и извлекут из этого класса эти заполняющие интерфейсные функции (*с функциональностью*):

bool paused;
public GameObject explosionPrefab;
public virtual void PlayerLostLife ()
{
// deal with player life lost (update U.I. etc.)
}
public virtual void SpawnPlayer ()
{
// the player needs to be spawned
}
public virtual void Respawn ()
{
// the player is respawning
}
public virtual void StartGame()
{
// do start game functions
}

Другие функции в BaseGameController, чтобы помочь превратить игру по всему быстрее. Если есть вещи, которые вы используете в различных играх, это может сэкономить время, чтобы включить их всех в сценарии, например эти, из которых можно вывести все остальные контроллеры игры. Это избавляет от необходимости переписывать один и тот же код снова и снова в нескольких проектах. Одним из таких примеров является функция Explode (), которая делает как раз это:

public void Explode ( Vector3 aPosition )
{
// instantiate an explosion at the position passed into this
// function
Instantiate( explosionPrefab,aPosition, Quaternion.identity );
}

Все Explode () делают этот экземпляр ("instantiate") игрового объекта ("GameObject") в положении передаваемом функцией вызывающего абонента. Последующие версии игрового контроллера скриптов будут использовать отдельный менеджер спавна, для работы с экземплярами ("instantiation"), но на этой стадии он существует просто в качестве общего, насколько это возможно, не будучи зависимыми от каких-либо других скриптов.

После Explode, мы видим еще 2 пустые функции, которые используются чтобы сказать игровому контроллеру когда регулярные враги будут уничтожены и когда босс будет уничтожен:

public virtual void EnemyDestroyed( Vector3 aPosition, int
pointsValue, int hitByID )
{
// deal with enemy destroyed
}
public virtual void BossDestroyed()
{
// deal with the end of a boss battle
}

Во всех играх нам нужны некоторые функции, такие как кнопки перезагрузки и функции паузы. В своей простейшей форме:

public virtual void RestartGameButtonPressed()
{
// deal with restart button (default behavior re-loads the
// currently loaded scene)
Application.LoadLevel(Application.loadedLevelName);
}

RestartGameButtonPressed () использует Application.LoadLevelfunction в Unity, чтобы обновить текущую сцену. Application.loadedLevelNamereturns строку со ссылкой на имя сцены загруженной на данный момент игры в память. Вы также можете получить индексный номер ссылки на сцене с Application.levelName. Этот индекс связывается с тем, как сцены организованы в параметрах сборки (File → Build Settings), а это означает, что переход вещи в настройках сборки может повлиять на работу вашей игры, если вы решите использовать индексные номера чтобы ссылаться на конкретные сцены в дальнейшем. Чтобы избежать путаницы, я предпочитаю придерживаться названий, когда я имею дело с загрузкой уровня(сцен).

Финальная часть BaseGameController это работа с механикой паузы и снятия с паузы игры:

public bool Paused
{
get
{
// get paused
return paused;
}
set
{
// set paused
paused = value;
if (paused)
{
// pause time
Time.timeScale= 0f;
} else {
// unpause Unity
Time.timeScale = 1f;
}
}
}

Переменная Bool с именем paused сохраняет состояние паузы внутри игры. Вместо того, чтобы обеспечить прямой доступ к ней, функция getter-setter используется таким образом, что мы можем действовать без необходимости следить за состоянием изменений .

"Get" часть просто *возвращает* булевскую переменную паузы.

Set часть *задает* булевскую переменную паузы и устанавливает Time.timeScale либо 0 (если на паузе) или 1 (если сняли с паузы). Установка Time.timeScale влияет как проходит время. Например, установка временных рамок до 0,5 будет означать, что время будет проходить в 2 раза медленнее, чем в реальном времени.
В документации Unity говорится:

За исключением realtimeSinceStartup, timeScale класс переменных Time влияет на измерения всего времени и времени дельты (delta time). Если у вас ниже timeScale, рекомендуется также ниже Time.fixedDeltaTime.
Функции FixedUpdate не будут вызываться, когда timeScale(шкала времени) устанавливается в ноль.

Обычно в видеоигре должны отобразится какие-нибудь сообщения, что бы сказать игроку, что игра остановлена, но на этом этапе, скрипт показывает чисто механику паузы, и мы будем помнить это.

Внимание! Этот перевод, возможно, ещё не готов.
Его статус: идёт перевод

Переведено на Нотабеноиде
http://notabenoid.org/book/55263/242437

Переводчики: ilia1395, Zeke0028

Настройки

Готово:

100.00% КП = 1.0