сделай мне систем для игрытовер дефенс чтобы юнит ...
Erstellt am: 2. März 2025
Erstellt am: 2. März 2025
сделай мне систем для игрытовер дефенс чтобы юнит при анимации атаки летел на врага
Ниже приведён упрощённый пример того, как можно реализовать систему (или её часть) для Tower Defense-игры, при которой во время анимации атаки юнит «летит» (или совершает рывок) к врагу. Рассмотрим, что у нас есть следующее:
В данном примере мы используем Unity/C# для иллюстрации кода, однако основная идея легко переносится в любой другой игровой движок.
Выбор цели (противника).
target
(Transform) – позиция врага.Подготовка анимации.
Перемещение юнита.
Поведение при достижении врага.
Обработка ситуации, если враг погиб или убежал до того, как юнит долетел:
Ниже – пример кода на C#, который демонстрирует одну из возможных реализаций:
csharpusing UnityEngine; public class FlyingAttack : MonoBehaviour { [Header("Параметры атаки")] [SerializeField] private float attackDistance = 0.5f; // На каком расстоянии от врага считаем, что мы «долетели» [SerializeField] private float dashSpeed = 5f; // Скорость рывка (полёта) [SerializeField] private float returnSpeed = 5f; // Скорость возвращения [SerializeField] private float damageAmount = 10f; // Сколько урона наносим при атаке [Header("Вспомогательные ссылки")] [SerializeField] private Animator animator; // Ссылка на аниматор юнита [SerializeField] private Transform target; // Кого атакуем (позиция врага) private Vector3 startPosition; // Точка, откуда начинался рывок private bool isAttacking = false; // Флаг, что сейчас идёт атака private bool isReturning = false; // Флаг, что возвращаемся private void Start() { // Запоминаем изначальную позицию юнита startPosition = transform.position; } private void Update() { if (isAttacking && target != null) { // Двигаемся к позиции врага MoveTowardsTarget(target.position, dashSpeed); // Проверяем, дошли ли мы до врага float distToTarget = Vector3.Distance(transform.position, target.position); if (distToTarget <= attackDistance) { // Считаем, что «прилетели» — атакуем OnReachEnemy(); } } else if (isReturning) { // Возвращаемся на изначальную позицию MoveTowardsTarget(startPosition, returnSpeed); // Если вернулись достаточно близко float distToStart = Vector3.Distance(transform.position, startPosition); if (distToStart <= 0.01f) { // Окончательно вернулись transform.position = startPosition; isReturning = false; // Завершаем анимацию атаки (триггер/флаг в аниматоре) animator.SetBool("IsAttacking", false); } } } /// <summary> /// Метод, запускающий атаку. Например, вызывается при нажатии на кнопку или при определённой логике ИИ. /// </summary> public void StartAttack(Transform newTarget) { if (isAttacking || isReturning) return; // чтобы не дублировать target = newTarget; // Устанавливаем начальную позицию (если юнит может стоять не на старте, а где-то ещё) startPosition = transform.position; // Запускаем анимацию атаки animator.SetBool("IsAttacking", true); // Ставим флаг начала рывка isAttacking = true; } /// <summary> /// Когда юнит долетел до врага. /// </summary> private void OnReachEnemy() { // Наносим урон врагу (если у врага есть, например, метод TakeDamage) EnemyHealth enemyHealth = target.GetComponent<EnemyHealth>(); if (enemyHealth != null) { enemyHealth.TakeDamage(damageAmount); } // Ставим флаг, что заканчиваем атаку и начинаем возврат isAttacking = false; isReturning = true; } /// <summary> /// Универсальный метод для движения к заданной точке с заданной скоростью (в 2D или 3D). /// </summary> private void MoveTowardsTarget(Vector3 destination, float speed) { transform.position = Vector3.MoveTowards( transform.position, destination, speed * Time.deltaTime ); // Повернуться лицом к цели (если нужно) Vector3 direction = destination - transform.position; if (direction.sqrMagnitude > 0.01f) { transform.rotation = Quaternion.LookRotation(direction, Vector3.up); } } }
isAttacking
: если включён, двигаемся к врагу.OnReachEnemy()
.isReturning
: если включён, двигаемся обратно к стартовой точке.animator.SetBool("IsAttacking", true/false)
. На аниматоре можно сделать соответствующие состояния.Такой подход позволит вашему юниту во время анимации атаки «вылетать» к врагу, наносить удар и возвращаться на исходную позицию (или оставаться там, если механика игры это предполагает). При желании можно завязать всё на корутины и анимационные события, чтобы не контролировать этапы полёта в Update()
.
Надеюсь, этот пример поможет вам реализовать логику «прилёта» юнита к врагу во время атаки в вашей Tower Defense!