Unreal Engine: Разветвление программы

Основы UnrealScript: Учимся на практике
В предыдущих подстатьях мы узнали об сравнениях и логических операторах. В этой подстатье я расскажу вам, как сделать так, чтобы наша программа действовала по разному в зависимости от результата этих сравнений или логических операторов. Этот текст уже знаком всем программистам, но и им советую прочитать, вдруг какие нюансы...

If else

If/elsе является базовым выражением для разветвления. Для примера возьмем предложение
Если будет идти дождь, я возьму зонтик.
Код, который отвечает этой фразе
if (bRaining)
{
    bUmbrella = true;
}
Обратите внимание, что просто указание логической переменной в скобках является аналогом bRaining == true. Чтобы срабатывало от обратного выражения, используйте bRaining == false или !bRaining.
Мы можем изменить выражение, добавив туда else
Если будет идти дождь, я возьму зонтик, иначе я надену рубашку с короткими рукавами.
Соответствующий код
if (bRaining)
{
    bUmbrella = true;
}
else
{
    bShortSleeves = true;
}
Для разветвления внутри разветвления можно использовать else if
Если будет идти дождь, я возьму зонтик, или если будет холодно, я надену свитер, иначе я надену рубашку с короткими рукавами.
Записывается это так
if (bRaining)
{
    bUmbrella = true;
}
else if (Temperature < ComfortableTemperature)
{
    bCoat = true;
}
else
{
    bShortSleeves = true;
}
Важно помнить, что как только одно из этих условий выполняется, то есть, сравнение Temperature < ComfortableTemperature не будет проводиться, если переменная bRaining будет равна true

For

Команда for заставляет делать программу определенный участок кода определенное количество раз. Синтаксис
for (m = 0; m < 3; m++)
{
     DoSomething(m);
}
Первая часть выражения в скобках обозначает начальное значение переменной m, вторая - условие, при котором программа выходит с цикла, третье - изменение переменной m. Наш пример обозначает, что функция DoSomething(m) будет выполняться до тех пор, пока m будет меньше 3, в нашем случае, 3 раза. Крайне не рекомендуется менять переменную m внутри цикла, так как это может повлиять на выполнение этого самого цикла. С другой стороны, считывать m, или использовать его в качестве параметров, можно сколько хочешь.

While

Этот цикл похож на for, но он просто повторяет кусок программы, пока выполняется условие. Соответственно, ни начальное значение, ни изменение переменной-счетчика (без которой можно и обойтись) в синтаксис не входит.
while (Int1 < 5)
{
    Int1++;
}
В скобках после while можно подставлять любое логическое выражение, используя хоть стринг, хоть целочисленные, хоть структуры, главное, чтобы на выходе было значение типа bool. К слову, ни в коем случае на забывайте добавить в цикл код, который будет обеспечивать выход программы из цикла (для вышеуказанного примера это Int1++), иначе при выполнении программа выдаст ошибку, да-да, зациклить UE3 не получится. Помимо прочего, для выхода из цикла можно использовать команду break. Например:
while (Int1 < 5)
{
    Int1++;
    if(Int1 == 3)
        break;
}
В таком случае, вместо того, чтобы досчитывать до 5, и тогда выходить с цикла, программа сделает это на значении 3. Другая полезная команда - continue. Вместо того, чтобы полностью выйти с цикла, она просто говорит программе пропустить код цикла, который следует после нее, и начать выполнять весь этот код заново. Для лучшего понимания пример:
while (Int1 < 5)
{
    Int1++;
    if(Int1 == 3)
        continue;
    DoSomething();
}
В этом случае, как только Int1 примет значение 3, команда DoSomething() пропускается, а цикл выполняет этот код заново, уже при Int1 равном 4.
Цикл while будет полезным, если вы не знаете точно, сколько раз вам придется выполнить действие, или это число будет меняться во время игры. И помните - цикл обязательно должен заканчиваться, иначе программа не будет работать корректно.

Do until

Полный аналог while, за исключением того, что условие стоит в конце цикла, а не в его начале, что значит, если может быть ситуация, когда while не выполнится ни разу, do until сначала выполнится, а уже потом посмотрит на условие. Само же условие обратное, то есть, если while перестает работать в тот момент, когда условие не соответствует действительности, то do until будет работать как раз пока условие не выполняется.
do
{
    Int1++;
} until (Int1 > 5);

Switch

Более продвинутая версия if/else. Выполняет определенный код для каждого определенного значения переменной.
switch(Int1)
{
    case 1:
        FirstDoSomething();
    case 2:
        SecondDoSomething();
    case 3:
        ThirdDoSomething();
    default:
        DefDoSomething();
}
Если переменная Int1 будет равна значению, указанному после case, весь код ниже будет исполняться, том числе, и код для других значений. То есть, для значения 2 выполнятся и SecondDoSomething(), и ThirdDoSomething(), и DefDoSomething(). Иногда это бывает полезно, но если это не то, что вам нужно, просто поставьте break перед каждым следующим casedefault, само собой; к слову, код после default будет выполняться, если наше значение не прошло ни в одном из указанных условий, в нашем случае, это может быть 0 или 4). Подмечу, что необязательно выделять скобками блок кода для каждого case.

Return

Эта команда похожа на break, только вместо выхода из цикла она выходит из функции. Например.
function TestFunction()
{
    if(Int1 == 5)
    { 
        DoSomething();
        return;
    }
    DoSomethingElse();
}
Тут, если значение будет равно 5, выполнится команда DoSomething(), после чего функция TestFunction перестанет выполняться, не добравшись до DoSomethingElse().

Goto

Эта команда будет переносить нас к определенной метке.
function TestFunction()
{
    RandomFucntion();

    goto EndOfFunction;

    DoSomething();

    EndOfFunction:
        DoSomethingElse();
}
Таким образом, после выполнения RandomFucntion(), мы сразу переходим к EndOfFunction и выполняем DoSomethingElse(), игнорируя DoSomething(). Не самая полезная команда, и обычно используется в комбинации с другими ответвляющими командами. И лучше не ставьте метки в коде выше, чем саму команду перехода, так как это, вероятней всего, опять приведет к зацикливанию программы.

Вот и закончена последняя статья, посвященная исключительно синтаксису. Теперь я начинаю уроки, которые будут влиять непосредственно на геймплей.

Просмотров: 4 911

Doc #1 - 8 лет назад 0
оооо, goto, печально =)
lentinant #2 - 8 лет назад 0
Doc, на практике оно почти никогда не юзается, впрочем, его использование в сложном коде со стейтами почти неизбежно.
lentinant #3 - 8 лет назад 0
Заметил несколько ошибок в while и одну недоговорку в do until. fxd
P.S. 81 просмотр, и никто не обратил внимания. Ай-яй-яй
Montaro #4 - 7 лет назад 0
Еще замечание, как и в C++, в конце каждого блока case, конструкции switch, обязательно нужен break, конечно, если для различных case не подразумевается одна и та же обработка.
lentinant #5 - 7 лет назад 0
Montaro,
Если переменная Int1 будет равна значению, указанному после case, весь код ниже будет исполняться, том числе, и код для других значений. То есть, для значения 2 выполнятся и SecondDoSomething(), и ThirdDoSomething(), и DefDoSomething(). Иногда это бывает полезно, но если это не то, что вам нужно, просто поставьте break перед каждым следующим case