Читать книгу Делаем PC игру вместе - Ар'лан ис'Дрекхэм - Страница 11

«Делаем PC игру вместе»
8. Оператор условия if ()

Оглавление

Возвращаемся к коду. Настало время операторов. Оператор это символ или текстовое слово, которое обозначает какие-либо действия с данными. Уясним один из самых главных операторов всего языка программирования C#, он называется if (если) – условие. Его можно охарактеризовать как один из самых фундаментальных наряду с оператором циклического повторения for (для) – цикл. Умозрительно можно сказать, что все программы на планете Земля представляют собой вариации кодов основанных на операторах условия if и циклического повторения for, независимо от конкретного языка программирования. Напишем такие строчки кода в «тело» нашего сценария FPCharacter, прямо под методом Start ():

void Update ()

{

if (Input.GetKey (KeyCode. LeftShift))

{

_speedfast = speedfast;

}

}

Во-первых, у нас появился описанный ранее метод Update (), который запускается каждый кадр на протяжении работы программы игры. Во-вторых, мы теперь можем видеть два вложенных друг в друга «тела» структур: одно из них является содержимым метода Update (), т.е. все то, что находится между его фигурными скобками, а второе «тело» принадлежит оператору if () – находится, так сказать, в его пределах воздействия. Тут есть интересная особенность, о которой обязательно нужно упомянуть: если «в теле» оператора if () объявить какую-либо переменную, то она будет доступна только «в теле» оператора if (). Напротив, если объявить переменную «в теле» метода Update (), она будет доступна и в Update () и в if ().

Теперь оператор if (). Это оператор, который необходим чтобы просто напросто описать условие: «если – то». В нашем случае, сейчас, это описание действия «если нажата такая-то клавиша, то сделать такое то действие». В коде Input.GetKey (KeyCode. LeftShift) используются класс и метод определения нажата ли пользователем определенная клавиша на клавиатуре, в данном случае Левый Шифт (LeftShift). Все это выражение является условием оператора if (). Если клавиша нажата, то выполняется код находящийся «в теле» оператора if ().

Причем, что интересно, проверка «нажата ли клавиша» произойдет, например, 60 раз за одну секунду, если игра работает со скоростью 60 FPS – это как раз к тем сведениям, которые описывались в начале книги.

Продолжим. «В теле» оператора if () появилась одна новая переменная _speedfast. Сначала объявим ее, «в теле» нашего класса FPCharacter, сразу под объявленными ранее переменными скоростей запишем такую строчку кода:

float _speedfast;

Сейчас мы объявили переменную типа float без указания ключевого слова public. Это делается для того, чтобы она не появилась в окне Inspector редактора, так как не требует установки вручную и кроме этого сценария (FPCharacter) нигде больше не используется, т.е. она внутренняя или локальная. Также мы не задали ее значение, поэтому в данном случае эта переменная равна 0.

Общий вид кода нашего сценария теперь такой:

using UnityEngine;

public class FPCharacter: MonoBehaviour

{

public float speed = 2.0f;

public float speedfast = 50.0f;

public float gravity = -9.8f;


float _speedfast;


CharacterController CharControl;


void Start ()

{

CharControl = GetComponent <CharacterController> ();

}

void Update ()

{

if (Input.GetKey (KeyCode. LeftShift))

{

_speedfast = speedfast;

}

}

}


Теперь нажимая клавишу левый шифт на клавиатуре, переменная _speedfast будет принимать значение переменной speedfast. Но сейчас такое присвоение значений будет иметь мало смысла так как не имеет никакого обратного действия, поэтому продолжим рассмотрение оператора if (). Переменная speedfast нужна чтобы ускорить движение нашего персонажа держа клавишу левый шифт, т.е. когда клавиша левый шифт не будет нажата скорость персонажа должна быть обычной. Для реализации этого пишем такие строчки кода, прямо после фигурной скобки «тела» оператора if ():

else

{

_speedfast = 1;

}


У нас появилась новая часть оператора if (), которая называется else (еще), это ветвление, т.е. если условие заданное кодом в операторе if () не выполняется по каким-то причинам, то выполнение условия можно разветвить – выполнить кусок кода находящийся «в теле» оператора else. Окончательно оператор if () в нашем случае будет выглядеть следующим образом:

if (Input.GetKey (KeyCode. LeftShift))

{

_speedfast = speedfast;

}

else

{

_speedfast = 1;


}

Таким образом, выполняясь каждый кадр множество раз в методе Update () будет производиться проверка нажатия клавиши левого шифта: если он нажат, то внутренняя (локальная) переменная скорости будет равна заданной вручную переменной speedfast, или если левый шифт не нажат, то локальная переменная будет равна 1. Нужно запомнить, что оператор if () сам по себе использовать можно, но оператор else без if () нельзя. Также бывают прочие ветвители условий когда к оператору else добаваляются еще данные для проверки. Это будет рассмотрено в книге далее.

Продолжим наш сценарий игрока. Напишем далее «в теле» метода Update () такие строчки кода:

float offsetX = Input.GetAxis («Horizontal») * speed * _speedfast;

float offsetZ = Input.GetAxis («Vertical») * speed * _speedfast;

Мы объявляем две локальные переменные offsetX и offsetZ, которые считывают нажатие клавиш ориентации в пространстве. Снова мы видим класс Unity3d под названием Input и получение осей координат Horizontal (горизонтальных) и Vertical (вкртикальных). Два слова Horizontal и Vertical являются, так сказать, собирательными для всех кнопок клавиатуры, джойстика и т. д. поделенных на 2 категории: горизонтальные и вертикальные. Вертикальные в данном случае понимается как противопоставление горизонтальным осям, потому что движение персонажа представялет собой влево-вправо и вперед-назад, но не влево-вправо, вверх-вниз.

Получая данные через класс Input от клавиатуры играющего, также мы умножаем данные на скорость и на быструю скорость (например, бег), которую только что разобрали. Знак звездочка означает обыкновенное умножение.

Делаем PC игру вместе

Подняться наверх