Когда новичок видит какой-то код, то чаще всего он не понимает что значат все эти названия перед символом =.
Начинают их тупо копировать, и даже не понимают смысла.
Всё очень просто! Это названия переменных, в которых хранятся данные, а игра к ним обращается согласно команд которые были вами ей переданы, то есть — происходит запуск кода.
Переменная — это как контейнер, коробка.
В переменную вы записываете данные. А если сравнивать с контейнером, коробкой — то складываете предметы.
Обращаясь к переменной, вы получаете доступ к её содержимому.
Например:
_a = createGroup east; // создаём группу (не самих юнитов, а именно группу в понимании ArmA)
Взято из одной моей миссии, полностью выглядит так (выше, переменная заменена с _newGroup на _a):
// Гранатомётчик на вышке (станок) _newGroup = createGroup east; _newUnit = createVehicle ['O_GMG_01_high_F', [27116.8,23355.5,-0.0877953], [], 0, 'CAN_COLLIDE']; createVehicleCrew _newUnit; (crew _newUnit) join _newGroup; _newUnit setDir 42.4852; _newUnit setPosATL [27116.8,23355.5,4.38447];
Здесь он создаётся прямо на вышке со своим станочным гранатомётом, и повёрнутый в нужную сторону.
Чтобы вы не создавали, оно будет прописано в переменную.
Потому что к этому нельзя обратиться, если оно не в переменной (не рассматриваем перебор по типу/классу и другому).
Создать можно:
Массив координат:
_places_list = [[2384.77,3699.89,0], [2518.77,3741.67,0],[2303.34,3681.72,0]];
Массив техники:
_truck = ["O_Truck_03_transport_F", "O_Truck_02_transport_F", "O_G_Offroad_01_F", "C_Van_01_box_F"];
Да и вообще всё что угодно.
Даже не массив, а просто ящик — тоже будет в переменной.
Для примера:
_boxes = "Land_Pallet_MilBoxes_F" createVehicle position player; // создаём ящики рядом с игроком
И обращаться к к этому мы будем так же через переменную.
Например:
_truck = (selectRandom _truck) createVehicle (selectRandom _places_list); // выбираем случайный грузовик из массива, и выбираем случайное место из массива координат
Для примера:
Давайте создадим небольшой текст, и обратимся к нему через команды hint и format (вставить в консоль отладки в реакторе (на ногах) / триггер или ещё куда, откуда запускаете код).
_a = "Это текст"; // создаём переменную, и в неё заводим текст. hint format ["%1",_a]; // обращаемся к переменной
Этот текст будет виден в правом верхнем углу экрана.
Кроме того, переменные бывают двух типов:
локальные — _peremennaya
глобальные — peremennaya
В первом случае (локальная), начинается с символа _ и читается только в том файле, в котором была создана, и только внутри своего скоупа (блока кода), то есть внутри {} .
Если написать её вне этих скобок {} , и обратиться к ней внутри них (и наоборот) — игра не поймёт что это за переменная, и что за данные в ней содержаться.
И так же, её нельзя использовать в поле «Имя переменной» в редакторе, для того чтобы к ней можно было обратиться.
Видна только в том скопе (scope — область видимости), где была создана.
Пример:
//scope call { //scope private _var = 1; }; _var
выдаст ошибку о том, что переменная _var не определена (undefined variable in expression), так как была создана в одном скопе, а обращаемся к ней в другом.
Однако используя вызов функции в незапланированной среде переменная может быть изменена.
Чтобы избежать этого, необходимо делать переменную приватной (закрытой).
Пример:
_var = 1; call { _var = 2; }; _var //return 2 private _var = 1; call { private _var = 2; }; _var //return 1
Ещё один пример:
if (true) then { private _var = 1; }; _var //undefined private _var = 0; if (true) then { _var = 1; }; _var //return 1
Переменные из вышестоящих скоупов видны в нижестоящих (вложенных).
call { _varFromScope0 = "A"; call { diag_log _varFromScope0; }; };
Во втором случае (глобальная) просто пишется своим именем (названием), и читается в любом месте файлов вашей миссии (конечно вне её пределов о ней ничего не известно).
Глобальную переменную можно использовать в поле «Имя переменной» в редакторе, для того чтобы к ней можно было обратиться.
Глобальная переменная видна в любом скопе и может быть перезаписана.
Пример:
call { var = 1; }; var = var + 1; var //return 2
Глобальная переменная создается так же, как локальная, но без _ , а так же не используется private.
Однако, не смотря на то, что это глобальная переменная, она локальна для каждого клиента и сервера. То есть если вы создадите глобальную переменную на сервере — на клиенте она будет не определена.
Пример:
if (isServer) then { var = 1; }; if (!isServer) exitWith { var //undefined };
Чтобы переменную видели все клиенты, необходимо сделать ее публичной:
Пример:
if (isServer) then { var = 1; publicVariable "var"; }; if (!isServer) exitWith { var //return 1 };
Второй способ создания глобальных переменных — создать ее в пространстве имен (например missionNamespace), с помощью setVariable
Пример:
missionNamespace setVariable ["var",1,true]; private _var = missionNamespace getVariable "var"; _var //return 1
третий параметр указывает будет ли переменная публичная (true/false)
Объявление переменной с идентификатором без префикса «_» добавляет её (переменную) в missionNameSpace.
При этом, локальные переменные оптимально использовать в случае написания кода.
Причины:
1.) Она отрабатывается и может быть сразу же перезаписана под другую задачу.
2.) Она не перемешивается с другими переменными из других файлов, в отличии от глобальных.
То есть, мы можем спаунить всё что угодно, при этом пользуясь только одной и той же переменной.
Разумеется, так мы делаем, если не планируем в процессе больше обращаться к этому объекту/юниту/группе. Если же планируем, то используем разные переменные.
_group
_group1
_group2
Это три разные переменные.
Типы данных:
Переменные имеют разный тип данных:
_var = 1; //NUMBER _var = "string"; //STRING _var = [1,2,3]; //ARRAY _var = true; //BOOLEAN
и другие, такие как:
- объект
- группа
- сторона
- и т.п.
О команде selectRandom поговорим в другой теме.
Что-то не поняли? Заходите в наш Discord, там вам всегда помогут.