Відправлення Снаряда
public class Projectile : MonoBehaviour
{
[SerializeField] int damage;
[SerializeField] float speed;
Rigidbody2D rb;
Vector2 direction;
public void Setup(Vector2 direction)
{
this.direction = direction;
rb = GetComponent<Rigidbody2D>();
transform.right = direction;
Destroy(gameObject, 6);
}
private void Update()
{
rb.velocity = direction * speed;
}
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log(collision.gameObject.name);
if (collision.tag == "Player")
{
if (collision.TryGetComponent(out IGetAttacked getAttacked))
{
getAttacked.GetAttacked(damage);
Destroy(gameObject);
}
}
}
}
Клас Projectile
відповідає за керування поведінкою снарядів, які ворог може запускати у гравця. Цей клас налаштовує напрямок і швидкість снаряда, оновлює його рух і обробляє зіткнення.
Метод Setup
public void Setup(Vector2 direction)
{
this.direction = direction;
rb = GetComponent<Rigidbody2D>();
transform.right = direction;
Destroy(gameObject, 6);
}
Призначення: Цей метод встановлює початковий стан снаряда.
Параметри: Приймає параметр Vector2 direction
для визначення напрямку руху снаряда.
Дії: Встановлює напрямок снаряда, отримує компонент Rigidbody2D
, прикріплений до снаряда, повертає снаряд у напрямку руху та планує його знищення через 6 секунд, щоб уникнути нескінченного існування.
Метод Update
private void Update()
{
rb.velocity = direction * speed;
}
Призначення: Оновлює рух снаряда.
Дії: Встановлює швидкість Rigidbody2D
, щоб перемістити снаряд у заданому напрямку з вказаною швидкістю.
Метод OnTriggerEnter2D
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log(collision.gameObject.name);
if (collision.tag == "Player")
{
if (collision.TryGetComponent(out IGetAttacked getAttacked))
{
getAttacked.GetAttacked(damage);
Destroy(gameObject);
}
}
}
Призначення: Обробляє зіткнення з іншими об'єктами.
Параметри: Приймає параметр Collider2D collision
для виявлення зіткнень.
Дії: Виводить у лог ім'я об'єкта, з яким зіткнувся снаряд, перевіряє, чи снаряд зіткнувся з об'єктом з тегом "Player", і якщо об'єкт має компонент, що реалізує інтерфейс IGetAttacked
, викликає метод GetAttacked
для нанесення шкоди. Після влучання у гравця снаряд знищується.
Чому реалізовано саме так
Модульність і повторне використання: Клас Projectile
розроблений як модульний і придатний до повторного використання для будь-якого типу снарядів, які може використовувати ворог. Завдяки встановленню напрямку та швидкості можна створювати різні снаряди з різною поведінкою.
Ефективне керування рухом: Використання компонента Rigidbody2D
для руху забезпечує відповідність снаряда фізичній системі Unity, що дає плавний і реалістичний рух.
Виявлення зіткнень і обробка шкоди: Метод OnTriggerEnter2D
дозволяє снаряду виявляти зіткнення з гравцем і коректно завдавати шкоди, забезпечуючи ефективну взаємодію між снарядом і гравцем.
Клас SendProjectileState
public class SendProjectileState : State
{
Animator animator;
System.Action sendProjectileFunc;
public SendProjectileState(Animator animator, System.Action sendProjectileFunc)
{
this.animator = animator;
this.sendProjectileFunc = sendProjectileFunc;
}
public override void StartState()
{
isStateFinished = false;
animator.SetBool("projectil", true);
}
public override void StartAction()
{
sendProjectileFunc();
}
public override void EndState()
{
animator.SetBool("projectil", false);
}
}
Клас SendProjectileState
— це окремий стан, який відповідає за поведінку ворога під час запуску снаряда. Цей клас наслідується від класу State
та містить методи для початку, завершення та ініціалізації дії атаки снарядом.
Конструктор
Конструктор ініціалізує SendProjectileState
за допомогою Animator
для анімацій та дії для запуску снаряда. Він присвоює ці значення відповідним змінним-членам.
Метод StartState
Цей метод встановлює isStateFinished
у значення false
та запускає анімацію снаряда, встановлюючи булевий параметр "projectil" в аніматорі у true
.
Метод StartAction
Цей метод викликає sendProjectileFunc
, яка виконує дію, визначену для запуску снаряда. Зазвичай цей метод викликається подією аніматора для синхронізації запуску снаряда з анімацією.
Метод EndState
Цей метод зупиняє анімацію снаряда, встановлюючи булевий параметр "projectil" в аніматорі у false
.
Чому ми зробили саме так
Модульність і повторне використання:
Клас SendProjectileState
розроблений як модульний, що дозволяє гнучко інтегрувати різні поведінки запуску снарядів за допомогою System.Action
.
Інтеграція з анімацією: Використовуючи параметри аніматора, стан забезпечує синхронізацію запуску снаряда з відповідною анімацією, що створює плавний і реалістичний досвід.
Функція запуску снаряда
void SendProjectile()
{
Vector2 direction = (player.position - transform.position).normalized;
Instantiate(projectile, projectileSendingPosition.position, Quaternion.identity).Setup(direction);
}
Метод SendProjectile
відповідає за створення та запуск снаряда у напрямку до гравця. Цей метод обчислює напрямок від ворога до гравця, створює снаряд і налаштовує його рух у розрахованому напрямку.
Визначення методу та компоненти
Визначення методу:
void SendProjectile()
: Цей метод не повертає значення та призначений для запуску снаряда.
Компоненти:
Vector2 direction = (player.position - transform.position).normalized;
Цей рядок обчислює напрямок від ворога до гравця шляхом віднімання позиції ворога від позиції гравця. Частина .normalized
гарантує, що вектор напрямку має довжину 1, тобто є одиничним вектором, який лише вказує напрямок.
Instantiate(projectile, projectileSendingPosition.position, Quaternion.identity).Setup(direction);
Цей рядок створює новий екземпляр снаряда у вказаній позиції (projectileSendingPosition.position
) без обертання (Quaternion.identity
). Метод Setup
викликається для створеного снаряда, щоб задати його напрямок.
Зв'язок з Unity Animator
Ми викликаємо функцію StartAction
за допомогою подій аніматора. Це дозволяє нам вказати точний кадр у анімації ворога, на якому має бути відправлений снаряд. Оскільки анімація складається з багатьох кадрів, важливо визначити точний момент для цієї дії.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
Awesome!
Completion rate improved to 3.33
Відправлення Снаряда
Свайпніть щоб показати меню
public class Projectile : MonoBehaviour
{
[SerializeField] int damage;
[SerializeField] float speed;
Rigidbody2D rb;
Vector2 direction;
public void Setup(Vector2 direction)
{
this.direction = direction;
rb = GetComponent<Rigidbody2D>();
transform.right = direction;
Destroy(gameObject, 6);
}
private void Update()
{
rb.velocity = direction * speed;
}
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log(collision.gameObject.name);
if (collision.tag == "Player")
{
if (collision.TryGetComponent(out IGetAttacked getAttacked))
{
getAttacked.GetAttacked(damage);
Destroy(gameObject);
}
}
}
}
Клас Projectile
відповідає за керування поведінкою снарядів, які ворог може запускати у гравця. Цей клас налаштовує напрямок і швидкість снаряда, оновлює його рух і обробляє зіткнення.
Метод Setup
public void Setup(Vector2 direction)
{
this.direction = direction;
rb = GetComponent<Rigidbody2D>();
transform.right = direction;
Destroy(gameObject, 6);
}
Призначення: Цей метод встановлює початковий стан снаряда.
Параметри: Приймає параметр Vector2 direction
для визначення напрямку руху снаряда.
Дії: Встановлює напрямок снаряда, отримує компонент Rigidbody2D
, прикріплений до снаряда, повертає снаряд у напрямку руху та планує його знищення через 6 секунд, щоб уникнути нескінченного існування.
Метод Update
private void Update()
{
rb.velocity = direction * speed;
}
Призначення: Оновлює рух снаряда.
Дії: Встановлює швидкість Rigidbody2D
, щоб перемістити снаряд у заданому напрямку з вказаною швидкістю.
Метод OnTriggerEnter2D
private void OnTriggerEnter2D(Collider2D collision)
{
Debug.Log(collision.gameObject.name);
if (collision.tag == "Player")
{
if (collision.TryGetComponent(out IGetAttacked getAttacked))
{
getAttacked.GetAttacked(damage);
Destroy(gameObject);
}
}
}
Призначення: Обробляє зіткнення з іншими об'єктами.
Параметри: Приймає параметр Collider2D collision
для виявлення зіткнень.
Дії: Виводить у лог ім'я об'єкта, з яким зіткнувся снаряд, перевіряє, чи снаряд зіткнувся з об'єктом з тегом "Player", і якщо об'єкт має компонент, що реалізує інтерфейс IGetAttacked
, викликає метод GetAttacked
для нанесення шкоди. Після влучання у гравця снаряд знищується.
Чому реалізовано саме так
Модульність і повторне використання: Клас Projectile
розроблений як модульний і придатний до повторного використання для будь-якого типу снарядів, які може використовувати ворог. Завдяки встановленню напрямку та швидкості можна створювати різні снаряди з різною поведінкою.
Ефективне керування рухом: Використання компонента Rigidbody2D
для руху забезпечує відповідність снаряда фізичній системі Unity, що дає плавний і реалістичний рух.
Виявлення зіткнень і обробка шкоди: Метод OnTriggerEnter2D
дозволяє снаряду виявляти зіткнення з гравцем і коректно завдавати шкоди, забезпечуючи ефективну взаємодію між снарядом і гравцем.
Клас SendProjectileState
public class SendProjectileState : State
{
Animator animator;
System.Action sendProjectileFunc;
public SendProjectileState(Animator animator, System.Action sendProjectileFunc)
{
this.animator = animator;
this.sendProjectileFunc = sendProjectileFunc;
}
public override void StartState()
{
isStateFinished = false;
animator.SetBool("projectil", true);
}
public override void StartAction()
{
sendProjectileFunc();
}
public override void EndState()
{
animator.SetBool("projectil", false);
}
}
Клас SendProjectileState
— це окремий стан, який відповідає за поведінку ворога під час запуску снаряда. Цей клас наслідується від класу State
та містить методи для початку, завершення та ініціалізації дії атаки снарядом.
Конструктор
Конструктор ініціалізує SendProjectileState
за допомогою Animator
для анімацій та дії для запуску снаряда. Він присвоює ці значення відповідним змінним-членам.
Метод StartState
Цей метод встановлює isStateFinished
у значення false
та запускає анімацію снаряда, встановлюючи булевий параметр "projectil" в аніматорі у true
.
Метод StartAction
Цей метод викликає sendProjectileFunc
, яка виконує дію, визначену для запуску снаряда. Зазвичай цей метод викликається подією аніматора для синхронізації запуску снаряда з анімацією.
Метод EndState
Цей метод зупиняє анімацію снаряда, встановлюючи булевий параметр "projectil" в аніматорі у false
.
Чому ми зробили саме так
Модульність і повторне використання:
Клас SendProjectileState
розроблений як модульний, що дозволяє гнучко інтегрувати різні поведінки запуску снарядів за допомогою System.Action
.
Інтеграція з анімацією: Використовуючи параметри аніматора, стан забезпечує синхронізацію запуску снаряда з відповідною анімацією, що створює плавний і реалістичний досвід.
Функція запуску снаряда
void SendProjectile()
{
Vector2 direction = (player.position - transform.position).normalized;
Instantiate(projectile, projectileSendingPosition.position, Quaternion.identity).Setup(direction);
}
Метод SendProjectile
відповідає за створення та запуск снаряда у напрямку до гравця. Цей метод обчислює напрямок від ворога до гравця, створює снаряд і налаштовує його рух у розрахованому напрямку.
Визначення методу та компоненти
Визначення методу:
void SendProjectile()
: Цей метод не повертає значення та призначений для запуску снаряда.
Компоненти:
Vector2 direction = (player.position - transform.position).normalized;
Цей рядок обчислює напрямок від ворога до гравця шляхом віднімання позиції ворога від позиції гравця. Частина .normalized
гарантує, що вектор напрямку має довжину 1, тобто є одиничним вектором, який лише вказує напрямок.
Instantiate(projectile, projectileSendingPosition.position, Quaternion.identity).Setup(direction);
Цей рядок створює новий екземпляр снаряда у вказаній позиції (projectileSendingPosition.position
) без обертання (Quaternion.identity
). Метод Setup
викликається для створеного снаряда, щоб задати його напрямок.
Зв'язок з Unity Animator
Ми викликаємо функцію StartAction
за допомогою подій аніматора. Це дозволяє нам вказати точний кадр у анімації ворога, на якому має бути відправлений снаряд. Оскільки анімація складається з багатьох кадрів, важливо визначити точний момент для цієї дії.
Дякуємо за ваш відгук!