Similar presentations:
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.
2023Unity
Теория
К этому моменту у нас уже собралось приличное
количество строк кода в методе Update.
Это считается плохим примером,
т.к. с каждой строчкой все сложнее
разобраться в том, где и что написано.
Решить эту проблему
нам помогут методы!
Нет, не Start и Update.
А наши собственные методы!
Изображение от Storyset на Freepik.com
8.
2023Unity
Теория
Метод – это блок кода, который
содержит определенную логику программы.
Конструкция методов
очень проста:
Пример:
[модификатор доступа] [параметр возврата] [название метода]()
{
// логика
}
private void Jump()
{
// логика прыжка
}
9.
2023Unity
Теория
В качестве параметра возврата
мы пока пишем void.
Это означает что методе может вызывается,
но не будет ничего возвращать.
У методов очень
простые правила:
1. Всегда написано с большой буквы.
2. Имеет понятное название, которое
говорит о том что он делает.
3. Нельзя создавать метод внутри
другого метода, но можно вызывать.
4. В C# методы пишутся только в блоке класса.
10.
2023Unity
Практика
Организация
кода
Применим эти знания на практике,
чтобы сделать код более понятным.
Изображение от 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.
2023Unity
Практика
private void Shot()
{
if (ammunitionCount > 0)
{
ammunitionCount = ammunitionCount - 1;
Debug.Log(airplaneName + " произвел выстрел");
Debug.Log("Боеприпасов осталось: " + ammunitionCount);
Также организуем
отдельный метод выстрела.
}
else
{
Debug.Log("Кончились боеприпасы");
}
}
13.
2023Unity
Практика
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.
2023Unity
Теория
GameObject имеет следующие
особенности и функции:
Определение положения, вращения
и масштаба в пространстве.
Возможность хранить компоненты, которые
добавляют функциональность объекту.
Поддержка иерархической структуры, где
один объект может быть дочерним к другому.
Возможность управления активностью
объекта (активация и деактивация).
Реагирование на события, такие как
столкновения, нажатия клавиш и т.д.
18.
2023Unity
Теория
Обращение к GameObject
может быть двух типов:
void Start()
{
// Создаем пустой контейнер и ищем любой игровой объект на сцене
GameObject myObject = GameObject.FindObjectOfType<GameObject>();
}
1.
GameObject (с большой буквы):
Это имя класса, которое представляет
сам объект GameObject в программном коде.
Используется для создания, управления
и взаимодействия с GameObject в коде.
19.
2023Unity
Теория
Обращение к 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.
2023Unity
Теория
Теперь обсудим уже частично знакомый
нам Transform, но при работе со скриптами.
Класс Transform в Unity представляет
компонент, который содержит информацию
о положении, вращении и масштабе игрового
объекта в пространстве.
Каждый игровой объект имеет компонент
Transform, и этот компонент отвечает
за его преобразование в 3D-пространстве.
22.
2023Unity
В скриптах класс 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.
2023Unity
К данному классу также можно
обращаться двумя способами.
Касательно различия между
Transform и transform:
1. Transform (с большой буквы):
Это имя класса, которое представляет
компонент Transform в программном коде.
Используется для доступа к компоненту
Transform объекта из кода, например, чтобы
изменить его положение, вращение или масштаб.
void Start()
{
//Создаем переменную с текущими параметрами трансформации объекта
Transform point_1 = this.transform;
Transform point_2 = transform;
// Две строки выполняют один и тот же функционал
}
24.
2023Unity
К данному классу также можно
обращаться двумя способами.
Касательно различия между
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.
2023Unity
Вот основные характеристики
и методы класса Vector3:
29.
2023Unity
Теория
Поля:
Статические свойства:
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.
2023Unity
Теория
Конструкторы:
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.
2023Unity
Практика
Добавь новое поле
для хранения данных 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.
2023Unity
Практика
private void DirectionInput()
{
float horizontal;
float vertical;
if (Input.GetKey(KeyCode.W))
{
//...
Добавим одну строчку
в методе DirectionInput.
if (Input.GetKey(KeyCode.A))
{
//...
direction.Set(vertical, 0f, horizontal);
}
35.
2023Unity
Практика
Теперь создадим метод Movement,
в котором будем вращать наш объект,
а также вызовем новый метод
FixedUpdate, в котором мы будем
вызывать данный метод.
private void FixedUpdate()
{
Movement();
}
private void Movement()
{
transform.Rotate(direction);
}
36.
2023С методом Update мы знакомы,
а вот FixedUpdate еще не знаем,
поэтому давай знакомиться!
Unity
37.
2023Unity
Отличие между методами
FixedUpdate и Update в Unity
заключается в том, как они вызываются
и с какой частотой они выполняются.
1.
Update:
a
Вызывается каждый кадр.
c Используется для обновления логики игры,
обработки пользовательского ввода, анимаций
и других важных операций, которые не требуют
строгой временной точности.
b
Частота вызова зависит
от производительности компьютера
и может быть разной на разных устройствах.
d При использовании физики в Update, результаты
могут быть непредсказуемыми, так как он зависит
от FPS (количество кадров в секунду).
38.
2023Unity
Отличие между методами
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.
2023Unity
Практика
Теперь заставим
самолетик полететь!
Мы умножаем расчеты
на Time.fixedDeltaTime
или Time.deltaTime для того, чтобы
учесть время, прошедшее между
текущим и предыдущим кадром.
Это необходимо для обеспечения
плавности и предсказуемости анимации
и движения в игре, независимо
от производительности устройства.
private void Movement()
{
transform.position = transform.position + transform.forward *
speed * Time.fixedDeltaTime;
transform.Rotate(direction);
}
43.
2023Unity
Практика
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.
2023Unity
Практика
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.
2023Unity
Практика
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.
2023Unity
Практика
Сверимся с кодом:
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.
2023Unity
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
programming