Массив — это набор элементов одного типа, следующих друг за другом, к которым можно получить доступ по соответствующим их позиции в массиве индексам.  Количество индексов,, необходимое для получения доступа к одному элементу называется  размерностью массива.

В зависимости от размерности массивы могут одномерными [ ]  и многомерными [,] [ ,, ] или [ ,,, ] и т. д..


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

Давайте объявим одномерный массив:

Тип массива будет int — только целые числа, длинна массива, то ест количество всех элементов, пусть будет равна 5-ти.

вот мы объявили одномерный массив по названием massiv1 длинной 5, длину массива мы всегда можем получить используя свойство Lenght.

Но все элементы в массиве будут равны 0, так как мы их не проинициализировали, то есть не присвоили каждому элементу массива свое значение. Проинициализировать массив можно несколькими способами, можно сделать это при объявлении, перечислив все элементы в фигурных { } скобках, количество элементов должно быть равным длине массива, иначе будет ошибка:

или сокращенно так:

Так же можно присвоить значение каждому элементу массива обращаясь к ним по индексам, очень важно запомнить, что индексы массивов начинаются с «0», то есть первому элементу массива будет соответствовать индекс «0», второму — «1» и так далее.

Обнуление массива в цикле for 


Двумерные массивы называются матрицами, для доступа к элементу в двумерном массиве необходимо два индекса, грубо говоря — один будет определять  строку в которой находится элемент, а второй положение элемента в этой строке. Объявляется и инициализируется двумерный массив следующим образом:

Данный массив будет представлять собой массив из 2 строк и 3 столбцов, состоящий из целых int чисел, чтобы обратится к элементу двумерного массива, нужно указывать два индекса:

мы присваиваем значение элементу, который находится на 1 строке (помним, что индексы начинаются с 0) на 3 позиции.

Свойство Lenght, соответственно, будет возвращать количество всех элементов массива:


Трехмерные и более массивы объявляются следующим образом:

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

Для инициализации многомерного массива необходимо в фигурных скобках указывать  значения каждого измерения

ref, out и params являются модификаторами параметров.

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

Аргумент, передаваемый в параметр ref, перед передачей должен быть инициализирован.

Модификатор out работает так же как и ref, но при этом значение аргумента не инициализируется и необходимо, что бы в вызываемом методе значение аргументу было присвоено.

Модификатор params указывает на передачу неопределённого количества параметров. В вызывающем методе в качестве параметров вызываемого метода с модификатором params, можно будет указать либо отдельные аргументы, либо массив либо вообще не указывать аргументы.

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

Math — это класс математических методов в C Sharp входящих в библиотеку System.

Mathf — класс математических методов библиотеки UnityEngine.

System.Math использует тип данных doubles а UnityEngine.Mathf тип данных floats. При использовании в Unity Math появляется необходимость постоянно конвертировать знания doubles/floats, но в тоже время тесты на ПК показывают, что методы System.Math отрабатывают быстрее чем UnityEngine.Mathf  даже с постоянной конвертацией значений. Но так же  mathf из библиотеки  UnityEngine содержит дополнительные специализированных методов.

Тип данных doubles имеет область значений ±5*10-324 до ±1,7*10306, размер 8 байтов и точность — 16 разрядов;

floats  имеет область значений ±1,5*10-45 до ±3,4*1033, размер  4 байта и точность — 7 разрядов:


UnityEngine.Mathf

Mathf.Sin — возвращает синус от угла f в радианах.

Mathf.Cos — возвращает косинус от угла f в радианах.

Mathf.Tan — возвращает тангенс от угла f в радианах.

Mathf.Asin — возвращает арксинус  f —  угол в радианах, арксинус которого равен f.

Mathf.Acos — возвращает арккосинус —  угол в радианах, арккосинус которого равен f.

Mathf.Atan — возвращает арктангенс f —  угол в радианах, арктангенс которого равен f.

Mathf.Atan2 — возвращает угол между осью x и двумерным вектором, начинающимся с нуля и заканчивающимся на (x, y).

Mathf.Sqrt — Возвращает квадратный корень от f.

Mathf.Abs — возвращает значение по модулю;

Mathf.Min — возвращает минимальное из двух значений;

Mathf.Max — возвращает максимальное из двух значений;

Mathf.Pow — возвращает f возведенное в степень n;

Mathf.Exp — экспонента значения;

Mathf.Log — логари́фм числа по основанию a, возвращает значение степени, в которую нужно возвести a что бы получить b, если основание a не указывать — то будет возвращен натуральный логарифм b, логарифм по e;

Число e — математическая константа, приблизительно равная 2,718281828… подробнее об этой константе https://ru.wikipedia.org/wiki/E_(%D1%87%D0%B8%D1%81%D0%BB%D0%BE)

Mathf.Log10 —  десятичный логарифм, логарифм по основанию 10;

Mathf.Ceil — округление к большему целому значению;

Mathf.Floor — округление к меньшему целому значению;

Mathf.Round — округление до ближайшего целого числа, модуль разности с которым у исходного числа меньше. (2.4 → 2, 2.7 → 3). В случае, если модули разности равны (дробная часть равна 0.5), берётся ближайшее чётное целое число. (1.5 → 2, 4.5 → 4),

Mathf.CeilToInt — то же, что и Mathf.Cell но возвращает значение типа int.

Mathf.FloorToInt — то же, что и Mathf.Floor но возвращает значение типа int.

Mathf.RoundToInt — то же, что и Mathf.Round но возвращает значение типа int.

Mathf.Sign — возвращает знак числа. Возвращает  1 если число больше или равно нулю и -1 если число меньше нуля;

Mathf.Clamp —  ограничивает значение f в пределах интервала между min и max. Возвращает возвращает min, если f меньше min. Если f больше max, то возвращает max. Иначе, если f находится в интервале между min и max, возвращает f;

Mathf.Clamp01 — делает тоже самое, что и Mathf.Clamp, но её min и max  равны, соответственно, 0 и 1;

Mathf.Lerp(a, b, t) — Интерполяция между a и b по параметру t, где t находится в интервале от 0  до 1. Если t  будет равно 0 то метод вернет значение a, если же t  будет равно 1  — то значение b, если t  будет равно 0,5 то метод вернет значение среднее между a и , соответственно при любых других значениях t  между 0 и 1 будут возвращаться соответствующие промежуточные между a и b значения. Если t окажется вне диапазона от 0 до 1 то метод вернет null — то есть ничего.

Пример:

В данном примере в качестве параметра t выступает Time.time — время прошедшее  с начала запуска игры поэтому движение от стартовой позиции до конечной произойдет за 1 секунду если этого мало, то просто необходимо  поделить значение Time.time например на 10 (умножить на 0,1) — тогда движение уже будет длиться 10 секунд.

Интерполяция  — способ нахождения промежуточных значений величины по имеющемуся дискретному набору известных значений.

Mathf.LerpAngle — Same as Lerp but makes sure the values interpolate correctly when they wrap around 360 degrees.

Mathf.SmoothStep — Interpolates between min and max and eases in and out at the limits.

Mathf.Approximately — сравнивает два значение с плавающей точкой на совпадение..

Mathf.SmoothDamp —  постепенно приводит значение к значению target (в отличие от Lerp делает это плавно);

Mathf.SmoothDampAngle — Based on Game Programming Gems 4 Chapter 1.10

Mathf.Repeat —  возвращая остаток от деления t на length зацикливает значение t, так, что оно никогда не будет меньше 0 и больше чем length;

Пример использования:

Каждый кадр будет возвращать

 

Mathf.PingPong — PingPongs the value t, so that it is never larger than length and never smaller than 0.

Mathf.InverseLerp — Calculates the Lerp parameter between of two values.

Mathf.ClosestPowerOfTwo — возвращает ближайшую степень двух значений.

Mathf.PerlinNoise


System.Math

Math.Abs — возвращает абсолютную величину  (модуль), имеет 7 перегрузок т.е. може принимать разные типы переменных.

Math.Acos —  определяется угол, арккосинус которого равен указанному числу.

Math.Asin —  определяется угол, косинус которого равен указанному числу.

Math.Atan — возвращает арктангенс числа (в радианах)

Math.Cos —  Возвращает косинус угла.

Math.Cosh —  Возвращает гиперболический косинус угла.

Гиперболическими называются функции, которые выражаются через экспоненту и  являющиеся координатами точки на гиперболе а не на окружности как обычные функции.

Гиперболический синус задается следующей формулой:

.

Гиперболический косинус:

Гиперболический тангенс:

Гиперболический котангенс:

Math.Exp —  экспонента.

Math.Log — возвращает логарифм: x — число которое нужно найти, osn — основание логарифма.

Math.Log10 —  возвращает десятичный логарифм.

Math.Max — возвращает из 2-х чисел большее число. Имеет 11 перегруженых методов.

Math.Min — возвращает из 2-х чисел меньшее число. Имеет 11 перегруженых методов.

Math.PI — возвращает число Пи.

Math.Pow — вычисляет число возведенное в степень:

Math.Sin — возвращает синус угла.

Math.Sinh  — возвращает гиперболический синус угла.

Math.Sqrt — возвращает квадратный корень.

Math.Tan — возвращает тангенс угла.

Math.Tanh — возвращает гиперболический тангенс угла.

Интерфейс для получения от Unity информации о времени.

captureFramerate

deltaTime — возвращает время в секундах, которое потребовалось для завершения последнего кадра (только чтение). Используется для того, что бы сделать частоту кадров в игре независимой. На величину Time.deltaTime необходимо умножать значение если мы перемещаем объект каждый кадр в событии Update() для плавности движения, таким образом мы говорим программе что бы объект перемещался на 10 м. каждую секунду а не каждый кадр;

fixedDeltaTime —  возвращает фиксированный интервал в секундах,  через который происходит обновление состояния физики. Частоту обновления можно настроить.

fixedTime — время последнего обновления FixedUpdate. Время в секундах с момента начала игры.

frameCount — общее число пройденных кадров.

 

 

Функции событий в порядке их выполнения:

Reset() — вызывается для инициализации свойств скрипта, когда он только присоединяется к объекту или когда пользователь нажимает кнопку сброса в контекстном меню инспектора. Данная функция вызывается только в режиме редактирования.

Awake() — эта функция всегда вызывается до любых функций Start и также после того, как префаб был вызван в сцену (если GameObject неактивен на момент старта, Awake не будет вызван, пока GameObject не будет активирован, или функция в каком-нибудь прикреплённом скрипте не вызовет Awake).  Используется для инициализации переменных или состояния игры перед её  началом.

OnEnable

Start

OnApplicationPause


FixedUpdate — вызывается через фиксированные равные промежутки времени и не зависит от fps. В данном событии происходит расчет  обновление физических данных поэтому работать с физикой,  в частности с rigidbody необходимо именно в этом событии.

Update — вызывается каждый кадр поэтому периодичность вызова зависит от fps — количества кадров в секунду, в данном событии необходимо работать с собственными перемещениями объектов;

Time.deltaTime — возвращает время которое прошло между двумя кадрами;

LateUpdate() — вызывается один раз в кадре, после завершения Update(). Любые расчеты, которые осуществляются в Update() будут завершены, при вызове LateUpdate(). Основным использованием LateUpdate() обычно является слежение за камерой от третьего лица. Если Вы осуществите движение Вашего персонажа в событии Update(), то движения камеры и расчётов её месторасположения можете вести в событии LateUpdate(). Это будет гарантировать, что персонаж прошел полностью перед камерой, и закрепил свое расположение.

 


OnPreCull

OnBecameVisible/OnBecameInvisible:

OnWillRenderObject

OnPreRender

OnRenderObject

OnPostRender

OnRenderImage

OnGUI

OnDrawGizmos


 

События coroutine


OnMouseDown — вызывается при нажатии кнопки мыши на коллайдере или элементе GUI;

OnMouseDrag  вызывается при нажатии кнопкой мыши на коллайдере или элементе GUI  и удержании кнопки нажатой, вызывается каждый кадр до тех пор пока кнопка не будет отпущена;

OnMouseEnter — вызывается при наведении курсора мыши на коллайдер или элемент GUI;

OnMouseOver — вызывается каждый кадр пока курсор мыши находится над коллайдером или элементом GUI;

OnMouseExit — вызывается когда курсор мыши покидает пределы коллайдера GUI;

OnMouseUp — вызывается при отпускании кнопки мыши после нажатия по коллайдеру или элементу GUI, данное событие вызывается даже если курсор после клика был перемещен за пределы элемента на котором было совершено нажатие;

OnMouseUpAsButton — как и OnMouseUp вызывается при отпускании кнопки но лишь при условии что курсор остался на том же элементе на котором было произведено нажатие, если курсор был перемещен после нажатия и удержании кнопки за пределы элемента — то событие не будет вызвано;

Функции OnMouse не будут вызываться если объекты принадлежат к слоям которые игнорируют Raycast — отправку «воображаемого» луча из до тех пор, пока он не встретит на пути коллайдер в сцене. Функции могут быть сопрограммами coroutine если использовать оператор yield — событие будет послано всем скриптам привязанным к коллайдеру или элементу GUI.

Пример:

OnDestroy

OnDisable

OnApplicationQuit

 

 

Компонент Rigidbody придает объекту физические свойства — у него появляется масса и на него начинает действовать сила тяжести. Благодаря данному компоненту, прикладывая различные силы к объекту, можно задавать ему движение или вращение.

Inspector-Rigidbody

Transform определяет положение (position), вращение (rotation) и масштаб (scale) объекта в сцене. У каждого объекта по умолчанию есть данный компонент.

Transform

Переменные

Position — определяет положение объекта в игровом пространстве.

localPosition — положение относительно родительского обьекта.

Значение хранится в структурах  Vector2(x,y), Vector3(x,y,z) и Vector4(x,y,z,w) 

Vector2(x,y) структура используется для определения 2D-позиций и направлений.

Vector3(x,y,z) используется для определения 3D-позиций и направлений.

Vector4(x,y,z,w)  —  используется для определения четырехкомпонентных векторов(тангенты мешей, описание шейдеров и т.д.) но  в большинстве случаев используется Vector3.

Пример использования:

eulerAngels —  определяет углы поворота (Углы Эйлера) в градусах.

localEulerAngles — определяет углы поворота относительно родительского обьекта.

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

Углы Эйлера — углы, описывающие три поворота системы. Что бы понять, что это за углы, почитайте про крен, тангаж и рысканье которые соответствуют этим трём углам.

Пример: