Содержание

Слайд 2

Які типи даних С# ви знаєте?

Повторення

Які типи даних С# ви знаєте? Повторення

Слайд 3

Update () фикликається що фрейму (ФПС, шви залежать від різних умов), тому

Update () фикликається що фрейму (ФПС, шви залежать від різних умов), тому
інтервали виклику функції можуть відрізнятися. Виклик FixedUpdate відбувається через сталі інтервали часу, тому після кожного виклику функції відбуваються необхідні розрахунки фізики

В чому різниця між Update () та FixedUpdate()?

Повторення

Слайд 4

Для чого використовується структура Vector3(x, y, z)?

Ця структура використовується всередині Unity для передачі 3D-позицій

Для чого використовується структура Vector3(x, y, z)? Ця структура використовується всередині Unity
та напрямків. Вона також містить функції для виконання загальних векторних операцій.

Повторення

Слайд 5

Для чого і в яких випадках використовується умова else if?

Це додаткова

Для чого і в яких випадках використовується умова else if? Це додаткова
умова, що перевіряється, після того, як умова if не виконалась.

Повторення

Слайд 6

Для створення більш цікавої (непередбачуваної ) динаміки гри дуже часто використовується генерація

Для створення більш цікавої (непередбачуваної ) динаміки гри дуже часто використовується генерація
випадкових чисел (рандомізація).

Це може бути:

Генерація ворогів

Генерація значень урону

Генерація випадкових об’єктів

Слайд 7

Генерація випадкових об’єктів

Скрипт випадкової генераціїї об’єктів додають до незнищуваного порожнього об’єкта, камери,

Генерація випадкових об’єктів Скрипт випадкової генераціїї об’єктів додають до незнищуваного порожнього об’єкта,
фону, тощо, вказуючи префаб об’єкта який треба генерувати.
Оголошуємо змінні:

public GameObject ball; //об’єкт, який будемо генерувати
float offsetX = 0; //початкове положення по Х
float offsetY = 10f; // початкове положення по Y
float fTime = 1f; //частота створення «клонів»

Слайд 8

У певному проміжку часу задаємо випадкову генерацію об’єкту в діапазоні значень по

У певному проміжку часу задаємо випадкову генерацію об’єкту в діапазоні значень по
осі Х.

Генерація випадкових об’єктів

void Update () {    if (fTime < Time.realtimeSinceStartup)    {      float offsetX = Random.Range(-10f,10f);      Instantiate(baloon, new Vector3(offsetX, 10f, -5), Quaternion.identity);      fTime = Time.realtimeSinceStartup + Random.Range(3f, 5f);    } }

Границі генерації випадкових значень

Слайд 9

Завдання

Створіть фон екрану (jpg картинка).
Створіть пороожній GameObject, що падатиме.
Задайте йому Rigidbody 2D

Завдання Створіть фон екрану (jpg картинка). Створіть пороожній GameObject, що падатиме. Задайте
та Collider.

Слайд 10

Завдання

Створіть Головного героя (ігровий персонаж).
Задайте йому також Rigidbody (тип – Static) та

Завдання Створіть Головного героя (ігровий персонаж). Задайте йому також Rigidbody (тип –
колаедр.
Створіть скрипт керування об’єктом.

Слайд 11

Знищення об’єктів

Напишемо скрипт, що детектуватиме контакт об’єктів і знищуватиме один з них.

Якщо

Знищення об’єктів Напишемо скрипт, що детектуватиме контакт об’єктів і знищуватиме один з
обидва об’єкти мають колаедри – то найпростіший спосіб це зробити – використати функцію OnCollisionEnter.

void OnCollisionEnter2D(Collision2D col)
{
/*Тіло функції*/
}

Слайд 12

Знищення об’єктів

При контакті двох колаедрів задамо перевірку, що дозволить обирати колаедри лише

Знищення об’єктів При контакті двох колаедрів задамо перевірку, що дозволить обирати колаедри
з певним ім’ям і знищувати лише ці об’єкти:

void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.name == "Illus")
{
Destroy(col.gameObject);
}
}

Створюємо об’єкт класу Collision2D

Перевірка взаємодії з колаедром об’єкта з ім’ям “Illus”

Якщо ім’я співпало -знищуємо об’єкт, з яким взаємодіяли

Запустіть гру та перевірте

Слайд 13

Завдання

Напишіть скрипт для випадкової генерації тіл.
Підв’яжіть скрипт до порожнього GameObject.
Задайте префаб об’єкту,

Завдання Напишіть скрипт для випадкової генерації тіл. Підв’яжіть скрипт до порожнього GameObject.
що буде генеруватись.
Проаналізуйте діапазони та частоту створення випадкових тіл і внесіть необхідні зміни

Слайд 14

Завдання

public GameObject ball;
float offsetX = 0;
float offsetY = 10f;
float fTime = 1f;
void

Завдання public GameObject ball; float offsetX = 0; float offsetY = 10f;
Start()
{
}
void FixedUpdate()
{
if (fTime < Time.realtimeSinceStartup)
{
offsetX = Random.Range(-8f, 9f);
Instantiate(ball, new Vector3(offsetX, offsetY, 0), Quaternion.identity);
fTime = Time.realtimeSinceStartup + Random.Range(2f, 3f);
}
}

Слайд 15

Завдання

Запустіть гру та перевірте, як працює і чи знищуються згенеровані об’єкти при

Завдання Запустіть гру та перевірте, як працює і чи знищуються згенеровані об’єкти
контакті?

Знищується лише перший об’єкт, що додали на сцену, сгенеровані об’єкти контактують але не знищуються. Це пов’язано з особливостями генерації:

При генерації об’єктів до імені додається приписка (Clone), слід врахувати в скрипт.

Слайд 16

Завдання

Змінимо функцію OnCollisionEnter2D:

void OnCollisionEnter2D(Collision2D col)
{
if (col.gameObject.name == "Illus(Clone)")
{
Destroy(col.gameObject);

Завдання Змінимо функцію OnCollisionEnter2D: void OnCollisionEnter2D(Collision2D col) { if (col.gameObject.name == "Illus(Clone)")
}
}

Тепер відбувається знищення всіх об’єктів крім першого, його можна просто видалити.

Слайд 17

Метод детектування детектування взаємодії OnCollisionEnter має ряд недоліків:

Знищення об’єктів

один з об’єктів, що

Метод детектування детектування взаємодії OnCollisionEnter має ряд недоліків: Знищення об’єктів один з
взаємодіють обов’язково повинен мати не kinematic/static rigidbody.
будь-який інший об’єкт, у якого є колаедр відчуватиме вплив заданого.

Слайд 18

Знищення об’єктів

Вище наведені пункти значно ускладнюють процес реалізації детектування взаємодій, особливо, якщо

Знищення об’єктів Вище наведені пункти значно ускладнюють процес реалізації детектування взаємодій, особливо,
йдеться про постріли та Friendly fire. А в деяких іграх персонажам взагалі не задають колаедри, щоб позбутися можливих «блокувань».

Слайд 19

Знищення об’єктів

Для реалізації вище наведених прикладів краще використати детектування так званних LayerMask.

Знищення об’єктів Для реалізації вище наведених прикладів краще використати детектування так званних
Для цього слід провести перевірку входження детектуємого шару об’єкта в окіл уявної точки, що підв’язана до основного ігрового обє’кта:

CheckPoint

OverlapCircle(Radius)

Layer – “Ball”

Слайд 20

Знищення об’єктів

Створимо public змінні, в яких зможемо задати прив’язку уявної точки до

Знищення об’єктів Створимо public змінні, в яких зможемо задати прив’язку уявної точки
об’єкта, радіус перевірки, та шар, який будемо детектувати:


public Transform zubiCheckPoint; // точка перевірки контакту з об’єктом
public float zubiCheckRadius; // радіус перевірки контакту з об’єктом
public LayerMask zubiCheckLayer; // прошарок
private bool isTouchingzubi; // змінна для зберігання результату перевірки

Слайд 21

Знищення об’єктів

LayerMask - можуть бути використані для вибіркового фільтрування об'єктів гри, наприклад,

Знищення об’єктів LayerMask - можуть бути використані для вибіркового фільтрування об'єктів гри,
при проходженні променів:
постріли (friendly fire);
Взаяємодії об’єктів в обхід колаєдра, тощо.

Всього налічується 32 шари (фактично 32 біти: активний та неактивний стан). Якщо в скрипті шар в активному стані – то він детектується.

Слайд 22

Знищення об’єктів

Задайте персонажу новий шар:

Знищення об’єктів Задайте персонажу новий шар:

Слайд 23

Знищення об’єктів

isTouchingzubi = Physics2D.OverlapCircle(zubiCheckPoint.position, zubiCheckRadius, zubiCheckLayer);

Щоб визначити чи взаємодіють об’єкти. Слід визначити

Знищення об’єктів isTouchingzubi = Physics2D.OverlapCircle(zubiCheckPoint.position, zubiCheckRadius, zubiCheckLayer); Щоб визначити чи взаємодіють об’єкти.
потрапляння об’єкту, що знаходиться на заданому шарі в уявне «коло» (OverlapCircle).

Коло визначається координатою його центру в загальних(світових) координатах та його радіусом. Додатковий параметр layerMask дозволяє перевіряти лише об'єкти на певних шарах.

Слайд 24

if (isTouchingzubi)
{
Object.Destroy(this.gameObject);
}
else if (transform.position.y < -7f)
{
Object.Destroy(this.gameObject);
}
else {

if (isTouchingzubi) { Object.Destroy(this.gameObject); } else if (transform.position.y { Object.Destroy(this.gameObject); } else
}

Задамо умову знищення об’єкта при взаємодії з іншим (isTouchingzubi == true).
Також задамо умову знищення об’єкта, що вийшли за межі екрану та не були знищені основним ігровим об’єктом, щоб запобігти накопиченню «клонів» об’єкта:

Знищення об’єктів

Слайд 25

Завдання

Створіть порожній об’єкт і приєднайте до нього префаб кульки, що падатиме (кулька

Завдання Створіть порожній об’єкт і приєднайте до нього префаб кульки, що падатиме
буде дочірньою до об’єкта).

В скрипті, що відповідає за рух GameObject, що падатиме (у нас це Ball, скрипт можна взяти із попереднього уроку) додайте перевірку контакту з ігровим об’єктом.
Додайте умови знищення GameObject при контакті із ігровим об’єктом («Жуйка»/Zubi) та при вичерпанні часу існування клону.
Перетягніть скрипт на порожній об’єкт(Ball)

Слайд 26

Завдання

В Unity налаштуйте всі необхідні змінні:

В якості шару, контакт з яким детектується

Завдання В Unity налаштуйте всі необхідні змінні: В якості шару, контакт з
– оберемо шар головного персонажу (zubi).

Слайд 27

Завдання

Запустіть та перевірте

Завдання Запустіть та перевірте

Слайд 28

Анімація

Створюємо новий порожній GameObject. Додаємо до нього компонент Animator (Miscellaneous)

Анімація Створюємо новий порожній GameObject. Додаємо до нього компонент Animator (Miscellaneous)

Слайд 29

Анімація

У папці Assets створюємо дві папки Сontroller та Animation в яких будуть

Анімація У папці Assets створюємо дві папки Сontroller та Animation в яких
зберігатись файли Animator Controller та Animation відповідно

Animator Controller

Animation

Слайд 30

Анімація

В файл Animator Controller додаємо створений раніше Animation. Сам файл Animator Controller

Анімація В файл Animator Controller додаємо створений раніше Animation. Сам файл Animator
вставляємо у компонент Animator нашого порожнього GameObject

Слайд 31

Анімація

Після виконаних дій вікно анімації стало активним і можна заповнити його готовими

Анімація Після виконаних дій вікно анімації стало активним і можна заповнити його готовими спрайтами.
спрайтами.

Слайд 32

Анімація

Якщо не має готових(порізаних покадрово) спрайтів, можемо створити вносячи зміни в заготовку.

Анімація Якщо не має готових(порізаних покадрово) спрайтів, можемо створити вносячи зміни в заготовку.

Слайд 33

Анімація

Зберігаємо префаб.
Підв’язуємо анімацію до об’єкту в якому вона повинна з’являтись.

public GameObject

Анімація Зберігаємо префаб. Підв’язуємо анімацію до об’єкту в якому вона повинна з’являтись.
blue;

float fcoordX;
float fcoordY;

Instantiate(blue,new Vector3(fcoordX,fcoordY,0), Quaternion.identity);

fcoordX = zub.position.x;
fcoordY = zub.position.y;

Змінні для визначення поточного положення об’єкту до якого прив’язуємо анімації

Анімація

Оголошуємо змінні:

Визначення положення об’єкта

Функція виклику анімації на поточному місці об’єкта.

Имя файла: les_12.pptx
Количество просмотров: 50
Количество скачиваний: 0