Загружаем...
2 года и месяц назад
Прыжок противника в последнюю позицию игрока на Unity

Привет, друзья! Сегодня мы рассмотрим, как реализовать прыжок противника в последнюю известную позицию игрока в Unity. Эта механика может добавить больше динамики и реализма в вашу игру. В этом посте мы подробно разберем скрипт, который позволяет противнику прыгать в последнюю известную позицию игрока.

Пример реализации
Для начала, давайте рассмотрим скрипт, который позволяет противнику двигаться и прыгать к последней известной позиции игрока.



using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class EnemyMovement : MonoBehaviour
{
public Transform m_transform;
public bool isTarget;
public Animator animator;
private float stopDelay = 2f; // Задержка перед возобновлением движения
private float stopTimer = 0f; // Таймер задержки
private bool isStopping = false; // Флаг, указывающий на то, что противник останавливается

public AnimationCurve jumpHeightCurve; // Кривая для настройки высоты прыжка
private bool isJumping = false;
private float jumpStartTime = 0f;
private float jumpDuration = 1.5f; // Время прыжка и приземления (в секундах)
private Vector3 jumpStartPosition;
private Vector3 lastKnownTargetPosition;

void Start()
{
animator = GetComponent<Animator>();
}

// Update is called once per frame
void Update()
{
if (isTarget)
{
float distance = Vector3.Distance(transform.position, m_transform.position);

if (distance > 1.5f)
{
if (isStopping)
{
// Если таймер задержки истек, возобновляем движение
if (stopTimer >= stopDelay)
{
isStopping = false;
stopTimer = 0f;
}
else
{
// Увеличиваем таймер задержки
stopTimer += Time.deltaTime;
}
}
else
{
// Если не нужно останавливаться, двигаемся к цели
transform.position += (m_transform.position - transform.position).normalized * 1.5f * Time.deltaTime;
transform.LookAt(m_transform.position);

if (distance < 4f && Random.Range(0, 2) == 0)
{
JumpToLastKnownTargetPosition();
}
}
}
else
{
// Если дистанция меньше 1.5 метров, останавливаемся
isStopping = true;
animator.SetBool("Run", false);
}
}
UpdateJump();
}

public void SetTarget(Transform target, bool readyTarget)
{
if (readyTarget)
{
m_transform = target;
animator.SetBool("Run", true);
}
isTarget = readyTarget;
}

public void LostTarget()
{
isTarget = false;
animator.SetBool("Run", false);
m_transform = null;
}

void JumpToLastKnownTargetPosition()
{
isJumping = true;
jumpStartPosition = transform.position;
jumpStartTime = Time.time;
lastKnownTargetPosition = m_transform.position;
}

void UpdateJump()
{
if (isJumping)
{
float jumpProgress = (Time.time - jumpStartTime) / jumpDuration;
float jumpHeight = jumpHeightCurve.Evaluate(jumpProgress);

Vector3 targetPosition = lastKnownTargetPosition;
targetPosition.y += jumpHeight;

// Интерполируем движение к цели во время прыжка
transform.position = Vector3.Lerp(jumpStartPosition, targetPosition, jumpProgress);

if (jumpProgress >= 1f)
{
isJumping = false;
}
}
}
}


Объяснение кода
Определение переменных:

m_transform: Ссылка на трансформ игрока.
isTarget: Булевый флаг, указывающий, является ли игрок текущей целью.
animator: Аниматор для управления анимациями противника.
stopDelay и stopTimer: Переменные для управления задержкой перед возобновлением движения.
isStopping: Булевый флаг, указывающий, что противник останавливается.
jumpHeightCurve: Кривая анимации для настройки высоты прыжка.
isJumping, jumpStartTime, jumpDuration, jumpStartPosition, lastKnownTargetPosition: Переменные для управления прыжком.
Метод Start:
В методе Start мы получаем компонент Animator, который будет использоваться для управления анимациями.

Метод Update:

Проверяем, является ли игрок целью.
Если противник находится на расстоянии более 1.5 метров от игрока, то:
Если противник останавливается, проверяем таймер задержки и либо возобновляем движение, либо увеличиваем таймер.
Если противник не останавливается, он движется к цели и проверяет условия для прыжка.
Если противник находится ближе 1.5 метров к игроку, он останавливается и анимация бега отключается.
Вызывается метод UpdateJump для обновления состояния прыжка.
Метод SetTarget:

Устанавливает цель для противника и включает анимацию бега.
Метод LostTarget:

Отключает цель для противника и отключает анимацию бега.
Метод JumpToLastKnownTargetPosition:

Начинает прыжок к последней известной позиции игрока, сохраняя начальную позицию и время прыжка.
Метод UpdateJump:

Обновляет позицию противника во время прыжка, используя интерполяцию и анимационную кривую для высоты прыжка.
Заключение
Этот скрипт позволяет противнику динамично прыгать к последней известной позиции игрока, добавляя реалистичность и интересную механику в вашу игру. Надеюсь, этот пост был полезен для вас. Не стесняйтесь оставлять свои вопросы и комментарии ниже. Удачной разработки!


Наверх