5.95M
Категория: ПрограммированиеПрограммирование

C# Основные классы Unity

1.

2023
Тема занятия
C#: Основные
классы Unity
Название программы
Unity

2.

2023
План
занятия
Unity
Введение
Теория Методы
Практика Организация кода
Теория GameObject, Transform, Vector3
Практика Полет
Домашнее задание
Итоги
Изображение от Storyset на Freepik.com

3.

2023
Введение
На прошлом уроке мы научились
организовывать хранение данных
и производить с ними базовые манипуляции.
Сегодня мы применим эти данные
в Unity, и научимся взаимодействовать
со средой разработки!
Unity

4.

2023
Если не получилось выполнить
предыдущее задание, вот оно:
void Update()
{
float horizontal;
float vertical;
if (Input.GetKey(KeyCode.W))
{
vertical = -1;
}
else if (Input.GetKey(KeyCode.S))
{
vertical = 1;
}
else
{
vertical = 0;
}
if (Input.GetKey(KeyCode.A))
{
horizontal = 1;
}
else if (Input.GetKey(KeyCode.D))
{
horizontal = -1;
}
else
{
horizontal = 0;
}
Изображение от Storyset на Freepik.com

5.

2023
Обрати внимание:
Наш самолетик должен смотреть
по направлению оси Z!
Это очень важно и скоро ты поймешь почему.

6.

2023
Теория
Методы
Unity

7.

2023
Unity
Теория
К этому моменту у нас уже собралось приличное
количество строк кода в методе Update.
Это считается плохим примером,
т.к. с каждой строчкой все сложнее
разобраться в том, где и что написано.
Решить эту проблему
нам помогут методы!
Нет, не Start и Update.
А наши собственные методы!
Изображение от Storyset на Freepik.com

8.

2023
Unity
Теория
Метод – это блок кода, который
содержит определенную логику программы.
Конструкция методов
очень проста:
Пример:
[модификатор доступа] [параметр возврата] [название метода]()
{
// логика
}
private void Jump()
{
// логика прыжка
}

9.

2023
Unity
Теория
В качестве параметра возврата
мы пока пишем void.
Это означает что методе может вызывается,
но не будет ничего возвращать.
У методов очень
простые правила:
1. Всегда написано с большой буквы.
2. Имеет понятное название, которое
говорит о том что он делает.
3. Нельзя создавать метод внутри
другого метода, но можно вызывать.
4. В C# методы пишутся только в блоке класса.

10.

2023
Unity
Практика
Организация
кода
Применим эти знания на практике,
чтобы сделать код более понятным.
Изображение от Storyset на Freepik.com

11.

2023
Практика
Unity
private void DirectionInput()
{
float horizontal;
float vertical;
if (Input.GetKey(KeyCode.W))
{
vertical = -1;
}
else if (Input.GetKey(KeyCode.S))
{
vertical = 1;
}
else
{
vertical = 0;
}
if (Input.GetKey(KeyCode.A))
{
horizontal = 1;
}
else if (Input.GetKey(KeyCode.D))
{
horizontal = -1;
}
else
{
horizontal = 0;
}
Создадим отдельный метод
DirectionInput, в который перенесем
логику получения направления.
}

12.

2023
Unity
Практика
private void Shot()
{
if (ammunitionCount > 0)
{
ammunitionCount = ammunitionCount - 1;
Debug.Log(airplaneName + " произвел выстрел");
Debug.Log("Боеприпасов осталось: " + ammunitionCount);
Также организуем
отдельный метод выстрела.
}
else
{
Debug.Log("Кончились боеприпасы");
}
}

13.

2023
Unity
Практика
void Update()
{
DirectionInput();
if (Input.GetKeyDown(KeyCode.Mouse0))
{
Shot();
}
В методе Update нам достаточно
будет заменить все перенесенные
строки на название метода который
мы хотим здесь вызвать.
При этом логика программы никак
не изменится, и все будет работать также.
if (Input.GetKeyDown(KeyCode.LeftShift))
{
speed = speed * 2;
}
else if (Input.GetKeyUp(KeyCode.LeftShift))
{
speed = speed / 2;
}
}

14.

2023
Теория
GameObject,
Transform, Vector3
Unity

15.

2023
Теория
Чтобы наши знания работали
в самом Unity, нам нужно уметь
перевести их в данные, которые
сможет понять сам Unity.
Поэтому давай попробуем разобраться
в некоторых новых для нас элементах!
Unity

16.

2023
Первым рассмотрим
класс GameObject.
В Unity класс GameObject представляет
основной объект, который используется
для создания и управления сущностями в сцене.
GameObject является фундаментальным
компонентом игрового движка Unity
и представляет собой «контейнер»
или «сущность», к которой можно
присоединять компоненты, такие как скрипты,
материалы, коллайдеры, свет, аудио и т.д.
Все игровые объекты на сцене
представлены классом GameObject.
Unity

17.

2023
Unity
Теория
GameObject имеет следующие
особенности и функции:
Определение положения, вращения
и масштаба в пространстве.
Возможность хранить компоненты, которые
добавляют функциональность объекту.
Поддержка иерархической структуры, где
один объект может быть дочерним к другому.
Возможность управления активностью
объекта (активация и деактивация).
Реагирование на события, такие как
столкновения, нажатия клавиш и т.д.

18.

2023
Unity
Теория
Обращение к GameObject
может быть двух типов:
void Start()
{
// Создаем пустой контейнер и ищем любой игровой объект на сцене
GameObject myObject = GameObject.FindObjectOfType<GameObject>();
}
1.
GameObject (с большой буквы):
Это имя класса, которое представляет
сам объект GameObject в программном коде.
Используется для создания, управления
и взаимодействия с GameObject в коде.

19.

2023
Unity
Теория
Обращение к GameObject
может быть двух типов:
void Start()
{
// Выдаем данному игровому объекту новое имя
this.gameObject.name = "My Game Object";
gameObject.name = "My Game Object";
// Две строки выполняют один и тот же функционал
}
2.
gameObject (с маленькой буквы):
Это свойство класса MonoBehaviour, которое представляет
GameObject, к которому прикреплен данный скрипт.
Используется для обращения к текущему игровому
объекту, на котором находится скрипт, внутри самого скрипта.

20.

2023
Теория
Таким образом, различие между
GameObject и gameObject заключается
в том, что первое является именем класса,
представляющего сам объект GameObject,
а второе является свойством, позволяющим
получить доступ к текущему GameObject,
на котором находится скрипт.
Unity

21.

2023
Unity
Теория
Теперь обсудим уже частично знакомый
нам Transform, но при работе со скриптами.
Класс Transform в Unity представляет
компонент, который содержит информацию
о положении, вращении и масштабе игрового
объекта в пространстве.
Каждый игровой объект имеет компонент
Transform, и этот компонент отвечает
за его преобразование в 3D-пространстве.

22.

2023
Unity
В скриптах класс Transform имеет
следующие основные свойства и методы:
1.
position: Представляет позицию объекта
в 3D-пространстве в формате Vector3.
6. parent: Содержит ссылку на родительский
объект в иерархии сцены.
2.
rotation: Представляет вращение объекта
в 3D-пространстве в формате Quaternion.
7. childCount: Показывает количество
дочерних объектов у данного объекта.
3.
localPosition: Представляет локальную
позицию объекта относительно родительского
объекта.
4.
localRotation: Представляет локальное вращение
объекта относительно родительского объекта.
5.
lossyScale: Представляет глобальный
масштаб объекта, учитывая масштаб всех
родительских объектов.
8. Translate(Vector3 translation): Перемещает
объект на заданное смещение в мировых
координатах.
9. Rotate(Vector3 eulerAngles): Вращает объект
на заданный угол в мировых координатах.
10. LookAt(Vector3 target): Поворачивает объект так,
чтобы он смотрел на заданную точку в пространстве.

23.

2023
Unity
К данному классу также можно
обращаться двумя способами.
Касательно различия между
Transform и transform:
1. Transform (с большой буквы):
Это имя класса, которое представляет
компонент Transform в программном коде.
Используется для доступа к компоненту
Transform объекта из кода, например, чтобы
изменить его положение, вращение или масштаб.
void Start()
{
//Создаем переменную с текущими параметрами трансформации объекта
Transform point_1 = this.transform;
Transform point_2 = transform;
// Две строки выполняют один и тот же функционал
}

24.

2023
Unity
К данному классу также можно
обращаться двумя способами.
Касательно различия между
Transform и transform:
2. transform (с маленькой буквы):
Это свойство, доступное в скриптах
класса MonoBehaviour.
Представляет компонент Transform текущего
игрового объекта, на котором находится этот скрипт.
Используется для доступа к Transform текущего
объекта непосредственно внутри скрипта.
void Start()
{
//Создаем переменную с текущими параметрами трансформации объекта
Transform point_1 = this.transform;
Transform point_2 = transform;
// Две строки выполняют один и тот же функционал
}

25.

2023
Теория
Таким образом, различие между
Transform и transform заключается
в том, что первое является именем класса,
представляющего компонент Transform,
а второе является свойством,
позволяющим получить доступ к Transform
текущего объекта внутри скрипта.
Unity

26.

2023
Теория
А теперь рассмотрим
фундаментальный класс!
Без этого класса не обходится
ни 3D-графика, ни игровые движки.
Этот класс Vector3!
Unity

27.

2023
Теория
Класс Vector3 в Unity представляет
3D-вектор, то есть трехмерную точку
в пространстве с тремя осями: x, y и z.
Он широко используется для работы
с позициями, направлениями
и смещениями в трехмерном пространстве.
Unity

28.

2023
Unity
Вот основные характеристики
и методы класса Vector3:

29.

2023
Unity
Теория
Поля:
Статические свойства:
a
x: Координата по оси X.
a
zero: Вектор с нулевыми компонентами (0, 0, 0).
b
y: Координата по оси Y.
b
one: Вектор с компонентами равными единице (1, 1, 1).
c
up: Вектор направленный вверх (0, 1, 0).
d
down: Вектор направленный вниз (0, -1, 0).
e
left: Вектор направленный влево (-1, 0, 0).
f
g
right: Вектор направленный вправо (1, 0, 0).
h
back: Вектор направленный назад (0, 0, -1).
c
z: Координата по оси Z.
forward: Вектор направленный вперед (0, 0, 1).

30.

2023
Unity
Теория
Конструкторы:
a
Методы:
a
Set(float x, float y, float z):
Задает значения x, y и z для данного вектора.
b
Magnitude(): Возвращает длину (модуль) вектора.
c
SqrMagnitude(): Возвращает квадрат длины вектора
(это быстрее, чем Magnitude, так как не требует
извлечения квадратного корня).
d
Normalize(): Нормализует вектор
(делает его длину равной 1) без изменения направления.
e
Distance(Vector3 a, Vector3 b):
Возвращает расстояние между двумя векторами a и b.
f
Dot(Vector3 a, Vector3 b):
Возвращает скалярное произведение двух векторов a и b.
g
Cross(Vector3 a, Vector3 b):
Возвращает векторное произведение двух векторов a и b.
Vector3(float x, float y, float z):
Создает новый вектор
с заданными значениями x, y и z.

31.

2023
Теория
Класс Vector3 позволяет выполнять различные
операции с векторами, такие как сложение,
вычитание, умножение на скаляр,
нормализация, нахождение длины и другие.
Он чрезвычайно полезен в различных
аспектах разработки игр, таких как управление
движением объектов, обработка столкновений,
расчеты освещения и многое другое.
Unity

32.

2023
Практика
Полет
Unity

33.

2023
Unity
Практика
Добавь новое поле
для хранения данных Vector3.
using UnityEngine;
public class AirplaneController : MonoBehaviour
{
private string airplaneName = "Air DEMON 666";
private float speed = 10f;
private int ammunitionCount = 30;
private Vector3 direction; // Направление движения

34.

2023
Unity
Практика
private void DirectionInput()
{
float horizontal;
float vertical;
if (Input.GetKey(KeyCode.W))
{
//...
Добавим одну строчку
в методе DirectionInput.
if (Input.GetKey(KeyCode.A))
{
//...
direction.Set(vertical, 0f, horizontal);
}

35.

2023
Unity
Практика
Теперь создадим метод Movement,
в котором будем вращать наш объект,
а также вызовем новый метод
FixedUpdate, в котором мы будем
вызывать данный метод.
private void FixedUpdate()
{
Movement();
}
private void Movement()
{
transform.Rotate(direction);
}

36.

2023
С методом Update мы знакомы,
а вот FixedUpdate еще не знаем,
поэтому давай знакомиться!
Unity

37.

2023
Unity
Отличие между методами
FixedUpdate и Update в Unity
заключается в том, как они вызываются
и с какой частотой они выполняются.
1.
Update:
a
Вызывается каждый кадр.
c Используется для обновления логики игры,
обработки пользовательского ввода, анимаций
и других важных операций, которые не требуют
строгой временной точности.
b
Частота вызова зависит
от производительности компьютера
и может быть разной на разных устройствах.
d При использовании физики в Update, результаты
могут быть непредсказуемыми, так как он зависит
от FPS (количество кадров в секунду).

38.

2023
Unity
Отличие между методами
FixedUpdate и Update в Unity
заключается в том, как они вызываются
и с какой частотой они выполняются.
2.
FixedUpdate:
a
Вызывается с постоянной частотой
раз во время каждого интервала
физического обновления (по умолчанию
каждые 0.02 секунды).
c Все изменения физики должны происходить
Используется для выполнения
физических расчетов и обновления
объектов, связанных с физикой, таких как
перемещение, силы, столкновения и т.д.
d Изменения, сделанные в FixedUpdate,
b
в FixedUpdate, чтобы обеспечить предсказуемое
и консистентное поведение вне зависимости
от частоты обновления кадров.
называются «физическими изменениями»,
и они автоматически учитываются системой
физики при следующем физическом обновлении.

39.

2023
Практика
Кратко говоря, если нам нужно обновить
игровую логику или обработать
пользовательский ввод, используем Update.
Если нам нужно обновить физические
свойства объектов, такие как их движение
или столкновения, используем FixedUpdate.
Соблюдение разделения между этими
методами поможет нам избежать проблем
с физикой и обеспечит более стабильную
и предсказуемую работу нашей игры!
Unity

40.

2023
Практика
Сохрани скрипт и прикрепи его
к Prefab самолетика.
Unity

41.

2023
Практика
Уже сейчас можно
проверить его работу!
Unity

42.

2023
Unity
Практика
Теперь заставим
самолетик полететь!
Мы умножаем расчеты
на Time.fixedDeltaTime
или Time.deltaTime для того, чтобы
учесть время, прошедшее между
текущим и предыдущим кадром.
Это необходимо для обеспечения
плавности и предсказуемости анимации
и движения в игре, независимо
от производительности устройства.
private void Movement()
{
transform.position = transform.position + transform.forward *
speed * Time.fixedDeltaTime;
transform.Rotate(direction);
}

43.

2023
Unity
Практика
1.
Time.deltaTime:
a
Time.deltaTime представляет собой время,
прошедшее с последнего кадра до текущего.
b
Он используется в методе Update
для выполнения плавных анимаций
и обновления логики объектов,
которые не зависят от физики.
c
Например, если объект должен
перемещаться на 10 единиц в секунду,
умножение на Time.deltaTime обеспечивает
плавное движение даже на разных
устройствах с разной частотой кадров.
2.
Time.fixedDeltaTime:
a
Time.fixedDeltaTime представляет собой
фиксированный интервал времени между
вызовами метода FixedUpdate.
b
Он используется в методе FixedUpdate
для выполнения расчетов, связанных
с физикой и движением объектов.
c
Если расчеты физических свойств объектов
не будут умножены на Time.fixedDeltaTime,
их скорость и перемещение будут зависеть
от частоты обновления физики, что может
привести к нестабильному и непредсказуемому
поведению на разных устройствах.

44.

2023
Unity
Практика
using UnityEngine;
Сверимся с кодом:
public class AirplaneController : MonoBehaviour
{
private string airplaneName = "Air DEMON 666";
private float speed = 10f;
private int ammunitionCount = 30;
private Vector3 direction;
void Start()
{
// Дз сюда :)
}
void Update()
{
DirectionInput();
if (Input.GetKeyDown(KeyCode.Mouse0))
{
Shot();
}

45.

2023
Unity
Практика
if (Input.GetKeyDown(KeyCode.LeftShift))
{
speed = speed * 2;
}
else if (Input.GetKeyUp(KeyCode.LeftShift))
{
speed = speed / 2;
}
Сверимся с кодом:
}
private void FixedUpdate()
{
Movement();
}
private void Movement()
{
transform.position = transform.position + transform.forward *
speed * Time.fixedDeltaTime;
transform.Rotate(direction);
}

46.

2023
Unity
Практика
Сверимся с кодом:
private void DirectionInput()
{
float horizontal;
float vertical;
if (Input.GetKey(KeyCode.W))
{
vertical = 1;
}
else if (Input.GetKey(KeyCode.S))
{
vertical = -1;
}
else
{
vertical = 0;
}
if (Input.GetKey(KeyCode.A))
{
horizontal = -1;
}

47.

2023
Unity
else if (Input.GetKey(KeyCode.D))
{
horizontal = 1;
}
else
{
horizontal = 0;
}
Практика
Сверимся с кодом:
direction.Set(vertical * -1, 0f, horizontal);
}
private void Shot()
{
if (ammunitionCount > 0)
{
ammunitionCount = ammunitionCount - 1;
Debug.Log(airplaneName + " произвел выстрел");
Debug.Log("Боеприпасов осталось: " + ammunitionCount);
}
else
{
Debug.Log("Кончились боеприпасы");
}
}
}

48.

2023
Практика
Теперь наш самолетик
умеет летать!
Unity
English     Русский Правила