Компьютерная память состоит из огромного числа маленьких элементов. Каждый этот маленький элемент похож на выключатель, у которого может быть только два состояния. Когда выключатель включен, ему приписывают значение равное 1, а когда выключатель выключен, ему приписывается значение 0. Именно из-за такого устройства памяти компьютера и используется двоичная система исчисления.
Значение каждого такого выключателя называют битом. Но для удобства использования, биты организованы в группы по 8 штук. Эта группа из 8 битов называется байт. В нашем языке есть буквы, а есть слова, а в программировании есть биты-буквы, которые объединяются в слова-байты.
В повседневной жизни мы привыкли к десятичной системе счисления, где десять цифр от 0 до 9. Правила перевода числа из десятичной системы счисления в двоичную и обратно можно найти в интернете.
Если нам нужно упорядочить большой объем вещей, то мы можем воспользоваться коробками и разложить эти вещи по коробкам. В программировании то же самое – большое количество байтов информации удобно разделять на ячейки памяти. Ячейки памяти могут иметь разную ёмкость, но в основном современные запоминающие устройства сейчас имеют размер ячейки, равный одной из степеней числа два: 8, 16, 32 или 64 бита. Самое главное, что отличает ячейку памяти – она имеет адрес (порядковый номер, число), по которому к ней может обращаться процессор.
Но в большом количестве коробок тоже нужно как-то ориентироваться. Чтобы найти то, что нам необходимо и при этом не перебирать все коробки, удобно будет эти коробки подписать. Если мы подпишем одну коробку «Книги», другую «Одежда», а третью «Посуда», то мы сразу можем взять нужную коробку и достать из нее необходимый предмет.
В программировании у ячеек памяти есть адрес, по которому можно обратиться к конкретной ячейке и получить из нее информацию. Чтобы упростить этот процесс, ячейкам дают имена.
Любая информация: графика, текст, звук на экране монитора — это результат размещения большого объема чисел в ячейках памяти компьютера и работе с ними. Задача программиста — написать программу, а это значит заполнить память компьютера нужными данными, произвести с ними необходимые действия, получить результат и вывести полученный результат пользователю.
Как уже упоминалось, информация хранится на компьютере в двоичном виде. Любая текстовая или графическая информация переводится в числовой формат, а число мы можем перевести из десятичной системы счисления в двоичную по определенному алгоритму.
Если мы используем для хранения информации 2 бита, то сможем представить в двоичном виде только числа от 0 до 3. Если для хранения взять 4 бита, то представить в двоичном виде можно уже числа от 0 до 15. С помощью одного байта или 8 бит закодировать можно уже числа до 255. Но для хранения числа 500 в двоичном виде одного байта уже не хватит, потребуется два байта. Возникает проблема – чтобы закодировать большое число, необходимо все больше и больше битов.
Если мы попытаемся положить много книг в маленькую коробку, то часть книг просто не влезут и потеряются. Число 500 не закодируешь одним байтом, а значит мы сохраним неправильную информацию, если используем только один байт. Как сообщить компьютеру, сколько битов или байтов нам необходимо для размещения числа?
Для этого в программировании существуют типы данных, с помощью которых можно сообщить компьютеру о том, сколько байт требуется для хранения данных. Можно представить их в виде коробок разного стандартного размера. Чем число, которое необходимо закодировать, больше, тем больше коробку необходимо для него использовать.
В языке программирования C# существует несколько встроенных типов данных, их еще называют примитивные типы данных.
Все примитивные типы представлены в таблице на рисунке 5, рассмотрим только те, которые чащ всего используются в работе.
Самый простой тип, тип bool, занимает всего 1 бит и хранит логическое значение, которое может быть либо «true», либо «false», то есть 1 или 0. Это и есть тот маленький переключатель.
Следующий тип занимает уже 8 бит или 1 байт, поэтому он так и назван «byte». С помощью него можно хранить числа от 0 до 255.
Следующий тип данных – это «int», который занимает 4 байта и его диапазон уже намного больше.
В типах «byte» и «int» можно сохранить только целые числа, а для дробных чисел есть свои типы – «float» и «double». Тип «float» занимает 4 байта, а тип «double» 8 байт. В Unity для хранения координат позиции, поворота и масштаба используются дробные числа типа «float». Тип «double» целесообразно использовать в случаях, когда требуется бОльшая точность.
А теперь с учетом всей вышеизложенной информации, определим понятие переменной.
Переменная – это именованная ячейка памяти, которую можно использовать для хранения и изменения какого-либо значения в коде программы. Важно запомнить, что переменная связывает между собой три понятия – это тип, имя и значение. Без связки этих трех свойств невозможно производить какие-то действия с переменными и памятью компьютера.
Определение переменной в коде программы осуществляется по четким правилам. Первое, что необходимо сделать – указать тип ячейки, то есть сколько байт ячейка будет занимать в памяти компьютера. Второе задать имя для этой ячейки, чтобы можно было идентифицировать эту область памяти по имени переменной. А затем можно с помощью знака «присваивания» разместить в этой ячейке значение.
Таким образом определяются переменные различного типа. Обратите внимание, что у типа «float» есть особенность – после указания значения в конце пишется символ «F», можно писать в большом или малом регистре, без разницы. Это связано с преобразованием дробных типов и тем, что по умолчанию все дробные числа считаются типом «double». Мы не будем углубляться, а просто запомним эту особенность.
С переменными можно осуществлять различные действия – изменять, складывать, вычитать, сравнивать и т.д. В ячейках памяти значения будут соответственно меняться.
Основные арифметические операции в языке C# записываются следующим образом:
«+» - операция сложения двух чисел;
«-» - операция вычитания двух чисел;
«*» - операция умножения двух чисел;
«/» - операция деления двух чисел. При делении стоит учитывать, что если оба операнда представляют целые числа, то результат также будет округляться до целого числа.
«%» - операция получение остатка от целочисленного деления двух чисел.
Имена переменным задаются согласно следующим правилам:
• Имя переменной может содержать только латинские буквы, числа и символ нижнего подчеркивания;
• Имя переменной не должно содержать пробелов;
• Имя переменной не должно начинаться с цифры;
• Регистр важен: delta и Delta это разные переменные.
Также в языке программирования С# есть список ключевых слов – это слова, которые зарезервированы для специальных внутренних команд компилятора языка. В этом списке, например, присутствуют все названия примитивных типов. Соответственно, если вы захотите назвать переменную «int», то получите ошибку, так как это слово уже обозначает тип данных для хранения чисел.
Но работать только с примитивными типами данных не всегда удобно. Когда мы переходим в игровое пространство Unity, то игровая сцена — это координатная плоскость или пространство, с
которыми мы знакомы из уроков математики. В двумерной системе координат работа ведется с парой чисел – координатой x и y, которые записываются парой в круглых скобках. Для трехмерного пространства используется тройка чисел – координаты x, y и z.
В редакторе Unity компонент Transform имеет три свойства Position, Rotation и Scale, которые состоят из трех координат. Любую позицию, поворот или масштаб игрового объекта мы сможем задать при помощи тройки чисел – координат x, y и z.
Поэтому для удобной работы в игровом движке создан свой тип данных, который называется вектор. Он может быть двумерным – тип Vector2 или трехмерным – тип Vector3. Этот тип данных требует для своего определения не одно значение, а сразу два (Vector2) или три (Vector3) и позволяет оперировать сразу двумя или тремя координатами объекта в привязке к одной переменной.
Такие типы данных вообще являются классами, но углубляться в объектно-ориентированное программирование (ООП) мы пока не будем, а просто запомним правила работы с такими переменными.
- Название НЕ примитивных типов, к которым и относятся Vector2 и Vector3, пишутся с заглавной буквы.
- При инициализации значения переменных такого типа используется ключевое слово new с повторным указанием типа.
В коде можно сначала определить переменную, а потом инициализировать ее значение:
Vector2 position1;
position1= new Vector3(1, 5);
Или можно сразу определить и инициализировать:
Vector2 position2= new Vector3(3, 2);
По аналогии можно определить переменную типа Vector3. Например:
Vector3 startPosition = new Vector3(4, 6, 7);
Можно представить переменную типа Vector2 опять же в виде коробки, в которой находятся еще две вложенные коробки для хранения координат x и y.
Чтобы обратиться к данным вложенных коробок, по правилам программирования используют символ точки. Например, нам необходимо вывести на экран координаты x и y переменной типа Vector2. Используем для этого команду Debug.Log (для чего эта команда и как ее использовать можно почитать здесь https://dzen.ru/a/Zbd_J6TwtSEEHWyt).
Vector2 position = new Vector2(3,5);
Debug.Log("x = " +transform.position.x + " y = " +transform.position.y);
На консоли мы увидим: x = 3 y = 5.
Действия с типами Vector2 и Vector3 ограничены правилами векторной алгебры. Например, вектора можно складывать, в результате получится новый вектор, координаты которого равны сумме соответствующих координат исходных векторов. Можно умножить координаты вектора на число. Но нельзя просто перемножать координаты векторов для получения нового вектора. Раздел векторной алгебры очень объемный и сложный, поэтому изучить его вы можете самостоятельно в интернете. Хороший разработчик игр должен понимать, как использовать вектора в работе.
Помимо типов Vector2 и Vector3 в редакторе Unity используется множество других встроенных типов. Например, любой игровой объект в коде представляется переменной типа GameObject:
GameObject Ship;
Любой компонент игрового объекта на сцене тоже является встроенным типом Unity. Именно благодаря этому появляется возможность изменять свойства этих компонентов через код.
Рассмотрим, например, компонент Transform, который имеет три свойства Position, Rotation и Scale, которые в свою очередь являются трехмерными векторами, т.е. имеют три координаты.
Если вернуться к коробкам, то здесь получается более сложная структура. Есть одна главная коробка компонента Transform, а в ней находится много вложенных коробок, среди которых есть коробки для хранения позиции, поворота и масштаба игрового объекта. Эти коробки хранят в себе значения типа Vector3, а значит тоже имеют внутри себя по три вложенных коробки для хранения координат x, y и z.
Такая вложенность может достигать нескольких уровней! Тип GameObject включает в себя множество свойств и компонентов, в том числе и компонент Transform. В этом случае уровень вложенных коробок возрастает еще на 1 уровень.
Обращение к внутренним свойствам также осуществляется при помощи символа «.».
Например, требуется вывести на экран координату x игрового объекта, который определен через переменную в коде.
GameObject Astreroid;
Debug.Log("x = " + Astreroid.transform.position.x);
Стоит отметить особенность работы с переменной типа Transform в Unity. Нельзя напрямую менять координаты положения, поворота и масштаба. Следующая запись повлечет за собой ошибку:
Astreroid.transform.position.x = 7;
Эти свойства можно изменить только как вектор:
Astreroid.transform.position = new Vector3(7, 5, 6);
И даже если необходимо изменить только одну координату x, все равно придется делать это полностью для всего вектора, просто остальные координаты использовать старые:
Astreroid.transform.position = new Vector3(7, Astreroid.transform.position.y, Astreroid.transform.position.z);
То есть взять значение из вложенной коробки с координатой x мы можем при помощи команды Astreroid.transform.position.x, а вот изменить отдельно координату нельзя, только через изменение всего вектора. Это правило нужно запомнить!
Переменные играют очень важную роль в скриптах Unity. С их помощью можно получать информацию о действиях пользователя, хранить и изменять свойства игровых объектов и многое другое.
Подробнее про использование переменных в скриптах можно почитать в статье https://dzen.ru/a/ZdLxUjWs1kpwHFql
Пример использования переменных можно посмотреть в этой статье https://dzen.ru/a/ZdMauDkzZBE3Y77F