|
C# Unity3D
Библиотеки:
using UnityEngine; //Подключает основные функции Unity using System; //Позволяет работать с математическими выражениями и т.д. using System.Collections; //Подключает основные расширения(коллекции) using System.Collections.Generic; //Подключает дополнительные коллекции using System.IO; //позволяет работать с чтением и записью в файл using System.Xml; //позволяет работать с xml файлами using System.Linq; //позволяет работать с динамическими массивами и т.д. |
Переменные
Статус переменных:
public //переменная отображается в Inspector. Её можно редактировать из других классов private //переменная не отображается в Inspector. К ней нет доступа из других классов |
Логический тип переменной:
bool //может принимать всего 2 значения, true или false |
Числовые типы переменных:
int //целый числовой тип float //числовой тип с плавающей запятой(дробные числа) |
Текстовые типы переменных:
string //текстовый тип переменных, поддерживает только буквенные символы char //тип переменных поддерживающий символы Unicode |
Переменные объектов сцены:
GameObject //переменная хранящая объект сцены Transform //данные об объекте: координаты, угол поворота, размер Vector2 //хранит 2D позицию, в основном используется для хранения координат и смещения текстур Vector3 //хранит координаты положения объекта (x, y, z) Vector4 //четырех-мерные координаты. Используются в сетке касательных или параметрах шейдеров AnimationClip //переменная клипа анимации |
Переменные изображения:
GUISkin //переменная скина, в скине хранятся изображения, так же есть настройки шрифта текста GUIStyle //добавляет в инспектор настройку одного стиля (лучше использовать когда мало стилей, в остальных случаях практичней использовать GUISkin) GUITexture //переменная изображения (обычная картинка) |
Функции
Название функции может быть ЛЮБЫМ. Но только стандартные функции имеют определенные свойства. То есть вашу функцию можно вызвать только вручную а стандартные вызываются при определенных обстоятельствах.
Функции появления и удаления объекта:
void Awake () {} //вызывается 1 раз при появлении объекта на сцене void OnDestroy() {} //вызывается 1 раз при удалении объекта со сцены |
Функции старта сцены:
void Start () {} //вызывается 1 раз при старте сцены после Awake, если таковой нет, то самой первой |
Функции выполняемые на каждый кадр:
void Update () {} //вызывается на каждый кадр void LateUpdate () {} //вызывается на каждый кадр самой последней void FixedUpdate () {} //вызывается с фиксированной частотой кадров, в основном используется для работы с rigidbody |
Функции работы с триггерами:
void OnTriggerEnter () {} //вызывается каждый раз при входе объекта в триггер (скрипт должен висеть на триггере) void OnTriggerExit () {} //вызывается каждый раз при выходе объекта из триггера (скрипт должен висеть на триггере) void OnTriggerStay () {} //вызывается на каждый кадр пока объект находится в триггере но котором висит данный скрипт |
Функции работы с мышью:
void OnMouseEnter () {} //вызывается в момент захода мыши на коллайдер объекта void OnMouseOver () {} //вызывается каждый кадр пока курсор указывает на коллайдер объекта void OnMouseExit () {} //вызывается в момент выхода мыши с коллайдера объекта void OnMouseDown () {} //вызывается когда пользователь нажал клавишу в то время как курсор находится над коллайдером void OnMouseUp () {} //вызывается когда пользователь отпустил кнопку мыши в то время как курсор находится над коллайдером void OnMouseUpAsButton () {} //вызывается один раз когда мышь выходит с коллайдера с зажатой кнопкой мыши void OnMouseDrag () {} //вызывается когда пользователь нажал на коллайдер объекта и все еще удерживает кнопку |
Активация / деактивация объектов на сцене:
void OnEnable () {} //вызывается в момент активации объекта (каждый раз) void OnDisable () {} //вызывается в момент деактивации объекта (каждый раз) |
Функции работы с коллайдерами:
void OnCollisionEnter () {} //вызывается 1 раз в момент касания коллайдера на котором висит скрипт другого объекта с коллайдером void OnCollisionExit () {} //вызывается 1 раз в момент когда коллайдер объекта перестал касаться другого коллайдера void OnCollisionStay () {} //вызывается на каждый кадр пока коллайдер объекта с этой функцией касается другого коллайдера |
Логические элементы:
Запись словом | Математическая запись | Запись на C# |
Присвоение | = | = |
Сравнение | = | == |
И | * | && |
Или | + | || |
Нет | *(-1) | ! |
Не равно | ≠ | != |
Ввод
С клавиатуры:
if (Input.GetKey(KeyCode.Код) {} //Условие выполняется пока зажата кнопка клавиатуры if (Input.GetKeyDown(KeyCode.Код) {} //Условие выполняется один раз в момент нажатия кнопки клавиатуры if (Input.GetKeyUp(KeyCode.Код) {} //Условие выполняется один раз в момент отпускания кнопки клавиатуры |
*Код — буквенное название кнопки клавиатуры
Пример для кнопки клавиатуры:
if (Input.GetKeyUp(KeyCode.W) { код } //Код выполнится один раз в момент отпускания кнопки W на клавиатуре |
Мышью:
if (Input.GetMouseButton(КОД)) {} //Условие выполняется пока зажата кнопка мыши if (Input.GetMouseButtonDown(КОД)) {} //Условие выполняется один раз в момент нажатия кнопки мыши if (Input.GetMouseButtonUp(КОД)) {} //Условие выполняется один раз в момент отпускания кнопки мыши |
КОД — код кнопки мыши которую нужно нажать для выполнения условия
0 — левая кнопка мыши
1 — правая кнопка мыши
2 — средняя кнопка мыши
Пример для кнопки мыши:
if (Input.GetMouseButtonDown(0)) { код } //при таком условии код в операторных скобках выполнится 1 раз в момент нажатия левой кнопки мыши. |
Операторы
Оператор if:
Данный условный оператор имеет 2 вида: полный и не полный. Полный вид отличается тем что он имеет альтернативное условие.
Оператор if:
if (Условие) {КОД} |
В данном случае КОД выполнится только если условие истинно. Вот эта же запись но на понятном языке:
Если (Условие) то выполняем {КОД} |
Общий вид полного оператора if:
if (Условие) {КОД1} else {КОД2} |
Тут если условие будет истиным то выполнится КОД1 если ложным то КОД2.
Русская расшифровка записи:
Если (Условие) то выполняем {КОД1} Иначе выполняем {КОД2} |
Так же можно добавлять несколько условий.
Пример добавления нескольких условий:
if (Условие) {КОД1} else if (Условие) {КОД2} else if (Условие) {КОД3} ... else {КОД n} |
Но такая конструкция громоздка и в конце концов приведет к тому что вы сами в ней запутаетесь, для множества условий лучше использовать оператор выбора switch
Оператор switch
Этот оператор так же имеет полный и не полный вид
Пример неполного:
switch (Переменная) { case Значение 1: КОД1; break; case Значение 2: КОД2; break; } |
Данный оператор будет по очереди сравнивать значение переменной с предлагаемыми значениями. Если значение переменной совпадет со значением 1 то выполнится КОД1. Если не совпадет ни с чем то нечего не произойдет. Для альтернативных значениях используют полную версию оператора.
Полная версия:
switch (Переменная) { case Значение 1: КОД1; break; case Значение 2: КОД2; break; default: КОД3; break; } |
В данном случае если не одно их значений не подойдет то выполнится КОД3
Связь скриптов
В Unity3d можно воздействовать как на переменные в другом скрипте так и на сам скрипт (вкл/выкл). В любом случае нам нужно сначала получить ссылку на изменяемый скрипт, то есть присвоить его переменной. Затем мы сможем без труда производить любые действия с этим скриптом и его содержимым.
Перейдем к практике:
public [название скрипта] [название переменной]; //инициализация переменной [название переменной скрипта].[название переменной в скрипте] = [значение]; //изменение конкретной переменной |
Конкретные примеры:
Допустим нам нужно изменить переменную stats в скрипте car
public car st; //мы присвоили переменной st скрипт car, в эту переменную в инспекторе нужно кинуть объект с изменяемым скриптом. st.stats = 10; //тут мы присвоили переменной stats в скрипте car значение 10 st.stats -= 10; //так можно вычесть из текущего значения переменной 10 (если прибавить то += 10) st.enabled = false; //так мы отключаем скрипт = true наоборот включит |
Важная деталь: изменяемая переменная должна иметь тип public! Иначе нам не дадут к ней обратиться!
Теперь информация для ленивых:
Можно обойтись без создания переменной под скрипт а напрямую обратиться к скрипту, делается это так:
GetComponent().stats = 10; |
Данная строка хороша для одноразового использования, но не желательна для использования в Update т.к. работает медленнее
Консоль
Синтаксис:
Debug.Log(); //Выводит в консоль сообщение серого цвета [обычное] Debug.LogWarning(); //Выводит в консоль сообщение желтого цвета [предупреждение] Debug.LogError(); //Выводит в консоль сообщение красного цвета [ошибка] |
Синтаксис:
Debug.Log("Massage"); //выведет слово Massage в консоль серым цветом Debug.LogError(a); //выведет в консоль значение переменной красным цветом |
Таймер
Создаем 2 переменные типа float:
public float Timer; //Время в секундах которое отсчитает таймер private float TimerDown; //Изменяемая переменная для внутренних операций |
В функции Start или Awake пишем:
TimerDown = Timer; //Задаем временной переменной значение которое нужно отсчитать |
Желательно в функции Update пишем следующий код:
if(TimerDown > 0) TimerDown -= Time.deltaTime; //Если время которое нужно отсчитать еще осталось убавляем от него время обновления экрана (в одну секунду будет убавляться полная единица) if(TimerDown < 0) TimerDown = 0; //Если временная переменная ушла в отрицательное число (все возможно) то приравниваем ее к нулю |
Если таймер отсчитал положенное время выполняем действия:
if(TimerDown == 0) { TimerDown = Timer; //Благодаря этой строке таймер запустится заново после выполнения всех действий в скобках //Сюда дописываем действия которые произойдут после конца отсчета } |
Полный код:
public float Timer; //Время в секундах которое отсчитает таймер private float TimerDown; //Изменяемая переменная для внутренних операций
void Start () { TimerDown = Timer; //Задаем временной переменной значение которое нужно отсчитать }
void Update () { if(TimerDown > 0) TimerDown -= Time.deltaTime; //Если время которое нужно отсчитать еще осталось убавляем от него время обновления экрана (в одну секунду будет убавляться полная единица) if(TimerDown < 0) TimerDown = 0; //Если временная переменная ушла в отрицательное число (все возможно) то приравниваем ее к нулю if(TimerDown == 0) { TimerDown = Timer; //Благодаря этой строке таймер запустится заново после выполнения всех действий в скобках //Сюда дописываем действия которые произойдут после конца отсчета } } |
Курсор
Отображение курсора:
Screen.showCursor = false //скрыть курсор Screen.showCursor = true //показать курсор |
Фиксация курсора:
Screen.lockCursor = true //заблокировать курсор в центре экрана Screen.lockCursor = false //разблокировать курсор |
Случайные числа
Генерация случайного числа типа float:
Random.Range(10.0f); //возвращает случайное число от 0 до 10 включительно Random.Range(-5.0f, 7.0f); //возвращает случайное число от -5 до 7 включительно |
Генерация значения типа bool:
float a = Random.value; //переменной a возвратится значение 0.0f или 1.0f (всего 2 варианта) с помощью if или switch можно создать преобразование float в bool |
Генерация случайного места положения внутри сферы:
transform.position = Random.insideUnitSphere * 10; //после выполнения объект на который воздействуем окажется в случайном месте сферы радиусом 10 и центром в его изначальном месте положения |
Генерация случайного места положения внутри круга:
Vector2 PositionNew = Random.insideUnitCircle * 7; //возвратит переменной PositionNew случайную сточку в круге с радиусом 7 |
Генерация случайного места положения на поверхности сферы:
transform.position = Random.onUnitSphere * 5; //возвращает случайную точку на поверхности сферы с радиусом 5 |
Генерация случайного угла поворота:
transform.rotation = Random.rotation; //возвратит случайный угол поворота |
Интерфейс
Все ниже приведенные методы нужно писать в функции OnGUI, это обязательное условие
Основные методы:
Нарисовать квадрат:
GUI.Box(new Rect(x1, y1, x2, y2), "text"); //рисует на экране квадрат в координатах x1 y1 шириной и высотой x2 y2 и пишет на нем "text"; |
Написание текста:
GUI.Label(new Rect(x1, y1, x2, y2), "text"); //пишет текст "text" в координатах x1 y1 в квадрате шириной x2 y2. Текст который не влез в данный квадрат не отображается |
Обычная кнопка:
if(GUI.Button(new Rect(x1, y1, x2, y2), "text")){КОД} //рисует кнопку в координатах x1 y1 шириной и высотой x2 y2 и пишет на ней "text"; при нажатии на ней мышью исполняется КОД |
Кнопка которая активируется пока пользователь удерживает ее:
if (GUI.RepeatButton(new Rect(x1, y1, x2, y2), "text")) {КОД} //рисует кнопку в координатах x1 y1 шириной и высотой x2 y2 и пишет на ней "text" при зажатии ее мышью исполняется КОД |
Вывод изображения на экран:
GUI.DrawTexture(new Rect(x1, y1, x2, y2), texture); //выводит на экран текстуру (texture - переменная типа Texture2D) текстура либо растягивается либо обрезается в соответствии с размерами x2 y2, но не обрезается |
Текстовое поле:
string stringText = GUI.TextField (new Rect (x1, y1, x2, y2), stringText, numLength); //рисует поле для ввода текста в координатах x1 y1, шириной и высотой x2 y2. Введенный текст присвоится переменной stringText. numLength - максимальное количество символов |
Поле для ввода паролей:
string passwordText = GUI.PasswordField (new Rect (x1, y1, x2, y2), passwordText, "*"[0], numLength); //рисует поле для ввода текста в координатах x1 y1, шириной и высотой x2 y2. Введенный текст присвоится переменной passwordText. "*" - символ на который будут заменяться все введенные пользователем символы. numLength - максимальное количество символов. |
Переключатель:
bool toggleBool = GUI.Toggle(new Rect(x1, y1, x2, y2), toggleBool, "Переключатель"); //рисует переключатель в координатах x1 y1. toggleBool возвращает значение переключателя. Рядом с переключателем пишется текст"Переключатель" |
Фон для GUI элементов:
GUI.backgroundColor = Color.yellow; //Накладывает на все GUI элементы желтый оттенок[Color.yellow] если указать [Color.red] будет красный оттенок |
Датчик изменения значений входных данных GUI элементов:
if (GUI.changed) Debug.Log("Message"); //Пишет слово "Message" в консоль если хоть один из GUI элементов управления (текстовые поля, кнопки, переключатели и т.д.) изменил значение своих входных данных (нажали на кнопку, дописали символ в текстовое поле и т.д.) |
Глобальное изменение тонировки GUI элементов:
GUI.color = Color.yellow; //Накладывает желтую тонировку на все GUI элементы в том числе и на текст |
Изменение цвета всего GUI текста на сцене:
GUI.contentColor = Color.yellow; //Изменяет только цвет всего текста на желтый. На цвет кнопок или фона не влияет. |
Raycast
Описание:
Raycast - луч, пуская который из определенной точки и в определенном направлении, можно получать свойства тех объектов в которые он упрется. Например проведя луч из дула пистолета в прямом направлении можно узнать во что попадет пуля, а так же координаты точки столкновения (самая частая реализация стрельбы)
Простейшая конструкция:
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:
hit.collider // ссылка на коллайдер, из нее получаем имя теги и т.д. hit.distance // расстояние от начала луча до точки столкновения с объектом hit.normal // нормаль к поверхности с которой столкнулись hit.point // координаты точки столкновения hit.rigidbody // ссылка на компонент rigidbody hit.textureCoord // uv координаты в точке столкновения hit.transform // получаем transform объекта с которым столкнулись hit.triangleIndex // индекс треугольника в который уперлись (используется в процедурной геометрии) |
В инспекторе
Эти команды позволяют оформлять переменные в окне инспектора. Многие из этих команд появились только в Unity 4.5, а значит в более ранних версиях доступны не будут. Все команды пишутся прямо над переменной на которую они воздействуют.
Например:
[команда] public int i; |
ЗАМЕЧАНИЕ: после этих команд не ставится ";"
Скрыть переменную в инспекторе:
[HideInInspector] |
Написать заголовок над переменной (работает и с русским языком):
[Header("Переменные позиции")] |
Устанавливает диапазон значения переменной (переменная будет отображаться в виде слайдера):
[Range(a, b)] // a - минимальное значение, b - максимальное значение |
Отступ между переменными:
[Space(a)] // a - высота отступа в пикселях |
Настраиваемое поле ввода текста:
[Multiline(a)] // a - высота поля в строках |
Улучшенное настраиваемое поле ввода текста:
[TextArea(a, b)] // a - высота поля в строках, b - максимальное количество строк если высота a будет превышена (сбоку появится скроллбар) |
Подсказка при наведении мыши на переменную (работает и с русским языком):
[Tooltip("Подсказка")] |
Дата добавления: 2015-11-04; просмотров: 1469 | Нарушение авторских прав
<== предыдущая лекция | | | следующая лекция ==> |
П: Здравствуйте, один билет до аэропорта, пожалуйста. | | | United we stand, divided we fall! |