C# Unity 3D

Библиотеки:

1
2
3
4
5
6
7
using UnityEngine; //Подключает основные функции Unity
using System; //Позволяет работать с математическими выражениями и т.д.
using System.Collections; //Подключает основные расширения(коллекции)
using System.Collections.Generic; //Подключает дополнительные коллекции
using System.IO; //позволяет работать с чтением и записью в файл
using System.Xml; //позволяет работать с xml файлами
using System.Linq; //позволяет работать с динамическими массивами и т.д.

Типы переменных:

Статус переменных:

1
2
public //переменная отображается в Inspector. Её можно редактировать из других классов
private //переменная не отображается в Inspector. К ней нет доступа из других классов

Логический тип переменной:

1
bool //может принимать всего 2 значения, true или false

Числовые типы переменных:

1
2
int //целый числовой тип
float //числовой тип с плавающей запятой(дробные числа)

Текстовые типы переменных:

1
2
string //текстовый тип переменных, поддерживает только буквенные символы
char //тип переменных поддерживающий символы Unicode

Переменные объектов сцены:

1
2
3
4
5
6
GameObject //переменная хранящая объект сцены
Transform //данные об объекте: координаты, угол поворота, размер
Vector2 //хранит 2D позицию, в основном используется для хранения координат и смещения текстур
Vector3 //хранит координаты положения объекта (x, y, z)
Vector4 //четырех-мерные координаты. Используются в сетке касательных или параметрах шейдеров
AnimationClip //переменная клипа анимации

Переменные изображения:

1
2
3
GUISkin //переменная скина, в скине хранятся изображения, так же есть настройки шрифта текста
GUIStyle //добавляет в инспектор настройку одного стиля (лучше исп когда мало стилей, в остальных случаях практичней исп GUISkin)
GUITexture //переменная изображения (обычная картинка)

Функции:

Название функции может быть ЛЮБЫМ. Но только стандартные функции имеют определенные свойства. То есть вашу функцию можно вызвать только вручную а стандартные вызываются при определенных обстоятельствах.
Функции появления и удаления объекта:

1
2
void Awake () {} //вызывается 1 раз при появлении объекта на сцене
void OnDestroy() {} //вызывается 1 раз при удалении объекта со сцены

Функции старта сцены:

1
void Start () {} //вызывается 1 раз при старте сцены после Awake, если таковой нет, то самой первой

Функции выполняемые на каждый кадр:

1
2
3
void Update () {} //вызывается на каждый кадр
void LateUpdate () {} //вызывается на каждый кадр самой последней
void FixedUpdate () {} //вызывается с фиксированной частотой кадров, в основном используется для работы с rigidbody

Функции работы с триггерами:

1
2
3
void OnTriggerEnter () {} //вызывается каждый раз при входе объекта в триггер (скрипт должен висеть на триггере)
void OnTriggerExit () {} //вызывается каждый раз при выходе объекта из триггера (скрипт должен висеть на триггере)
void OnTriggerStay () {} //вызывается на каждый кадр пока объект находится в триггере но котором висит данный скрипт

Функции работы с мышью:

1
2
3
4
5
6
7
void OnMouseEnter () {} //вызывается в момент захода мыши на коллайдер объекта
void OnMouseOver () {} //вызывается каждый кадр пока курсор указывает на коллайдер объекта
void OnMouseExit () {} //вызывается в момент выхода мыши с коллайдера объекта
void OnMouseDown () {} //вызывается когда пользователь нажал клавишу в то время как курсор находится над коллайдером
void OnMouseUp () {} //вызывается когда пользователь отпустил кнопку мыши в то время как курсор находится над коллайдером
void OnMouseUpAsButton () {} //вызывается один раз когда мышь выходит с коллайдера с зажатой кнопкой мыши
void OnMouseDrag () {} //вызывается когда пользователь нажал на коллайдер объекта и все еще удерживает кнопку

Активация / деактивация объектов на сцене:

1
2
void OnEnable () {} //вызывается в момент активации объекта (каждый раз)
void OnDisable () {} //вызывается в момент деактивации объекта (каждый раз)

Функции работы с коллайдерами:

1
2
3
void OnCollisionEnter () {} //вызывается 1 раз в момент касания коллайдера на котором висит скрипт другого объекта с коллайдером
void OnCollisionExit () {} //вызывается 1 раз в момент когда коллайдер объекта перестал касаться другого коллайдера
void OnCollisionStay () {} //вызывается на каждый кадр пока коллайдер объекта с этой функцией касается другого коллайдера

Логические элементы:

Логические элементы:

Запись словом Математическая запись Запись на C#
Присвоение =  =
Сравнение = ==
И * &&
Или + ||
Нет *(-1) !
Не равно !=

Ввод данных:

С клавиатуры:

1
2
3
if (Input.GetKey(KeyCode.Код) {} //Условие выполняется пока зажата кнопка клавиатуры
if (Input.GetKeyDown(KeyCode.Код) {} //Условие выполняется один раз в момент нажатия кнопки клавиатуры
if (Input.GetKeyUp(KeyCode.Код) {} //Условие выполняется один раз в момент отпускания кнопки клавиатуры

*Код — буквенное название кнопки клавиатуры

Пример для кнопки клавиатуры:

1
if (Input.GetKeyUp(KeyCode.W) { код } //Код выполнится один раз в момент отпускания кнопки W на клавиатуре

Мышью:

1
2
3
if (Input.GetMouseButton(КОД)) {} //Условие выполняется пока зажата кнопка мыши
if (Input.GetMouseButtonDown(КОД)) {} //Условие выполняется один раз в момент нажатия кнопки мыши
if (Input.GetMouseButtonUp(КОД)) {} //Условие выполняется один раз в момент отпускания кнопки мыши

КОД — код кнопки мыши которую нужно нажать для выполнения условия
0 — левая кнопка мыши
1 — правая кнопка мыши
2 — средняя кнопка мыши

Пример для кнопки мыши:

1
if (Input.GetMouseButtonDown(0)) { код } //при таком условии код в операторных скобках выполнится 1 раз в момент нажатия левой кнопки мыши.

Условные операторы:

Оператор if:

Данный условный оператор имеет 2 вида: полный и не полный. Полный вид отличается тем что он имеет альтернативное условие.

Оператор if:

1
if (Условие) {КОД}

В данном случае КОД выполнится только если условие истинно. Вот эта же запись но на понятном языке:

1
Если (Условие) то выполняем {КОД}

Общий вид полного оператора if:

1
2
if (Условие) {КОД1}
else {КОД2}

Тут если условие будет истиным то выполнится КОД1 если ложным то КОД2.
Русская расшифровка записи:

1
2
Если (Условие) то выполняем {КОД1}
Иначе выполняем {КОД2}

Так же можно добавлять несколько условий.

Пример добавления нескольких условий:

1
2
3
4
5
if (Условие) {КОД1}
else if (Условие) {КОД2}
else if (Условие) {КОД3}
...
else {КОД n}

Но такая конструкция громоздка и в конце концов приведет к тому что вы сами в ней запутаетесь, для множества условий лучше использовать оператор выбора switch

Оператор switch

Этот оператор так же имеет полный и не полный вид
Пример неполного:

1
2
3
4
5
6
7
8
9
switch (Переменная)
{
case Значение 1:
КОД1;
break;
case Значение 2:
КОД2;
break;
}

Данный оператор будет по очереди сравнивать значение переменной с предлагаемыми значениями. Если значение переменной совпадет со значением 1 то выполнится КОД1. Если не совпадет ни с чем то нечего не произойдет. Для альтернативных значениях используют полную версию оператора.
Полная версия:

1
2
3
4
5
6
7
8
9
10
11
12
switch (Переменная)
{
case Значение 1:
КОД1;
break;
case Значение 2:
КОД2;
break;
default:
КОД3;
break;
}

В данном случае если не одно их значений не подойдет то выполнится КОД3

Связь скриптов:

В Unity3d можно воздействовать как на переменные в другом скрипте так и на сам скрипт (вкл/выкл). В любом случае нам нужно сначала получить ссылку на изменяемый скрипт, то есть присвоить его переменной. Затем мы сможем без труда производить любые действия с этим скриптом и его содержимым.
Перейдем к практике:

1
2
public [название скрипта] [название переменной]; //инициализация переменной
[название переменной скрипта].[название переменной в скрипте] = [значение]; //изменение конкретной переменной

Конкретные примеры:
Допустим нам нужно изменить переменную stats в скрипте car

1
2
3
4
public car st; //мы присвоили переменной st скрипт car, в эту переменную в инспекторе нужно кинуть объект с изменяемым скриптом.
st.stats = 10; //тут мы присвоили переменной stats в скрипте car значение 10
st.stats -= 10; //так можно вычесть из текущего значения переменной 10 (если прибавить то += 10)
st.enabled = false; //так мы отключаем скрипт = true наоборот включит

Важная деталь: изменяемая переменная должна иметь тип public! Иначе нам не дадут к ней обратиться!
Теперь информация для ленивых:
Можно обойтись без создания переменной под скрипт а напрямую обратиться к скрипту, делается это так:

1
GetComponent().stats = 10;

Данная строка хороша для одноразового использования, но не желательна для использования в Update т.к. работает медленнее

Вывод сообщений в консоль:

Синтаксис:

1
2
3
Debug.Log(); //Выводит в консоль сообщение серого цвета [обычное]
Debug.LogWarning(); //Выводит в консоль сообщение желтого цвета [предупреждение]
Debug.LogError(); //Выводит в консоль сообщение красного цвета [ошибка]

Синтаксис:

1
2
Debug.Log("Massage"); //выведет слово Massage в консоль серым цветом
Debug.LogError(a); //выведет в консоль значение переменной красным цветом

Действия с курсором:

Отображение курсора:

1
2
Cursor.visible = false; //скрыть курсор
Cursor.visible = true; //показать курсор

Фиксация курсора:

1
2
Cursor.lockState = CursorLockMode.Locked; //заблокировать курсор в центре экрана
Cursor.lockState = CursorLockMode.Confined; //разблокировать курсор

Случайные значения:

Генерация случайного числа типа float:

1
2
Random.Range(10.0f); //возвращает случайное число от 0 до 10 включительно
Random.Range(-5.0f, 7.0f); //возвращает случайное число от -5 до 7 включительно

Генерация значения типа bool:

1
float a = Random.value; //переменной a возвратится значение 0.0f или 1.0f (всего 2 варианта) с помощью if или switch можно создать преобразование float в bool

Генерация случайного места положения внутри сферы:

1
transform.position = Random.insideUnitSphere * 10;  //после выполнения объект на который воздействуем окажется в случайном месте сферы радиусом 10 и центром в его изначальном месте положения

Генерация случайного места положения внутри круга:

1
Vector2 PositionNew = Random.insideUnitCircle * 7; //возвратит переменной PositionNew случайную сточку в круге с радиусом 7

Генерация случайного места положения на поверхности сферы:

1
transform.position = Random.onUnitSphere * 5; //возвращает случайную точку на поверхности сферы с радиусом 5

Генерация случайного угла поворота:

1
transform.rotation = Random.rotation; //возвратит случайный угол поворота

Графические элементы GUI:

Все ниже приведенные методы нужно писать в функции OnGUI, это обязательное условие

Основные методы:

Нарисовать квадрат:

1
GUI.Box(new Rect(x1, y1, x2, y2), "text"); //рисует на экране квадрат в координатах x1 y1 шириной и высотой x2 y2 и пишет на нем "text";

Написание текста:

1
GUI.Label(new Rect(x1, y1, x2, y2), "text"); //пишет текст "text" в координатах x1 y1 в квадрате шириной x2 y2. Текст который не влез в данный квадрат не отображается

Обычная кнопка:

1
if(GUI.Button(new Rect(x1, y1, x2, y2), "text")){КОД} //рисует кнопку  в координатах x1 y1 шириной и высотой x2 y2 и пишет на ней "text"; при нажатии на ней мышью исполняется КОД

Кнопка которая активируется пока пользователь удерживает ее:

1
if (GUI.RepeatButton(new Rect(x1, y1, x2, y2), "text")) {КОД} //рисует кнопку  в координатах x1 y1 шириной и высотой x2 y2 и пишет на ней "text" при зажатии ее мышью исполняется КОД

Вывод изображения на экран:

1
GUI.DrawTexture(new Rect(x1, y1, x2, y2), texture); //выводит на экран текстуру (texture - переменная типа Texture2D) текстура либо растягивается либо обрезается в соответствии с размерами x2 y2, но не обрезается

Текстовое поле:

1
string stringText = GUI.TextField (new Rect (x1, y1, x2, y2), stringText , numLength); //рисует поле для ввода текста в координатах x1 y1, шириной и высотой x2 y2. Введенный текст присвоится переменной stringText. numLength - максимальное количество символов

Поле для ввода паролей:

1
string passwordText = GUI.PasswordField (new Rect (x1, y1, x2, y2), passwordText, "*"[0], numLength); //рисует поле для ввода текста в координатах x1 y1, шириной и высотой x2 y2. Введенный текст присвоится переменной passwordText. "*" - символ на который будут заменяться все введенные пользователем символы. numLength - максимальное количество символов.

Переключатель:

1
bool toggleBool = GUI.Toggle(new Rect(x1, y1, x2, y2), toggleBool, "Переключатель"); //рисует переключатель в координатах x1 y1. toggleBool возвращает значение переключателя. Рядом с переключателем пишется текст"Переключатель"

Фон для GUI элементов:

1
GUI.backgroundColor = Color.yellow; //Накладывает на все GUI элементы желтый оттенок[Color.yellow] если указать [Color.red] будет красный оттенок

Датчик изменения значений входных данных GUI элементов:

1
if (GUI.changed) Debug.Log("Message"); //Пишет слово "Message" в консоль если хоть один из GUI элементов управления (текстовые поля, кнопки, переключатели и т.д.) изменил значение своих входных данных (нажали на кнопку, дописали символ в текстовое поле и т.д.)

Глобальное изменение тонировки GUI элементов:

1
GUI.color = Color.yellow; //Накладывает желтую тонировку на все GUI элементы в том числе и на текст

Изменение цвета всего GUI текста на сцене:

1
GUI.contentColor = Color.yellow; //Изменяет только цвет всего текста на желтый. На цвет кнопок или фона не влияет.

Raycast:

Описание:

Raycast - луч, пуская который из определенной точки и в определенном направлении, 
можно получать свойства тех объектов в которые он упрется. Например проведя луч из дула пистолета 
в прямом направлении можно узнать во что попадет пуля, а так же координаты точки столкновения (самая частая реализация стрельбы)

Простейшая конструкция:

1
2
3
4
RaycastHit hit; // переменная возвращающая свойства объекта
Ray ray = new Ray(transform.position, Vector3.up); // инициализируем луч (в скобках начальная точка[тип Vector3] и направление[тип Vector3])
if (Physics.Raycast (ray, out hit, distance)) // проверяем уперся-ли наш луч в объект, если да - возвращает true, нет - false. ray - луч, hit - переменная возвращающая свойства объекта, distance - расстояние на которое пускаем луч[тип float или int]
    if(hit.collider.name == "player") // вернет true, если имя объекта в который упрется луч будет "player"

Вот какие еще свойства можно получить из hit:

1
2
3
4
5
6
7
8
hit.collider // ссылка на коллайдер, из нее получаем имя теги и т.д.
hit.distance // расстояние от начала луча до точки столкновения с объектом
hit.normal // нормаль к поверхности с которой столкнулись
hit.point // координаты точки столкновения
hit.rigidbody // ссылка на компонент rigidbody
hit.textureCoord // uv координаты в точке столкновения
hit.transform // получаем transform объекта с которым столкнулись
hit.triangleIndex // индекс треугольника в который уперлись (используется в процедурной геометрии)

Оформление в окне инспектора:

Эти команды позволяют оформлять переменные в окне инспектора. 
Многие из этих команд появились только в Unity 4.5, а значит в более ранних версиях доступны не будут. 
Все команды пишутся прямо над переменной на которую они воздействуют.

Например:

1
2
[команда]
public int i;
ЗАМЕЧАНИЕ: после этих команд не ставится ";"

Скрыть переменную в инспекторе:

1
[HideInInspector]

 

Написать заголовок над переменной (работает и с русским языком):

1
[Header("Переменные позиции")]

 

Устанавливает диапазон значения переменной (переменная будет отображаться в виде слайдера):

1
[Range(a, b)] // a - минимальное значение, b - максимальное значение

 

Отступ между переменными:

1
[Space(a)] // a - высота отступа в пикселях

Настраиваемое поле ввода текста:

1
[Multiline(a)] // a - высота поля в строках

Улучшенное настраиваемое поле ввода текста:

1
[TextArea(a, b)] // a - высота поля в строках, b - максимальное количество строк если высота a будет превышена (сбоку появится скроллбар)

Подсказка при наведении мыши на переменную (работает и с русским языком):

1
[Tooltip("Подсказка")]

Поиск объектов:

Поиск объектов:

1
2
3
4
5
GameObject go = GameObject.Find("Название объекта"); // найти объект на сцене по названию
GameObject go = GameObject.Find("Название объекта/название дочернего объекта"); // найти объект по заданной иерархии
GameObject go = GameObject.FindGameObjectWithTag("Название объекта"); // найти объект на сцене по тегу
GameObject[] go = GameObject.FindGameObjectsWithTag("Название объекта"); // найти все объекты на сцене по тегу