Переменные. Что это такое, и какие они бывают.

Когда новичок видит какой-то код, то чаще всего он не понимает что значат все эти названия перед символом =.
Начинают их тупо копировать, и даже не понимают смысла.
Всё очень просто! Это названия переменных, в которых хранятся данные, а игра к ним обращается согласно команд которые были вами ей переданы, то есть — происходит запуск кода.

Переменная — это как контейнер, коробка.
В переменную вы записываете данные. А если сравнивать с контейнером, коробкой — то складываете предметы.
Обращаясь к переменной, вы получаете доступ к её содержимому.


Например:


_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, там вам всегда помогут.