сделай мне систем для игрытовер дефенс чтобы юнит ...
創建於:2025年3月2日
創建於:2025年3月2日
сделай мне систем для игрытовер дефенс чтобы юнит при анимации атаки летел на врага
Ниже приведён упрощённый пример того, как можно реализовать систему (или её часть) для 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!