231 |
С т р а н и ц а
Монстр больше ничего не будет делать. Вы можете сделать, чтобы монстр дразнил
игрока, когда увидит первый раз, но это мы припасли в качестве упражнения для
вас.
Движение монстра – управляемое поведение
Монстры в самых базовых играх, обычно не обладают сложным поведением
движения. Обычно они просто идут на цель и атакуют. Мы спрограммируем такой
тип монстров в этой игре. Но представьте себе, вы можете получить более
интересную игру с монстрами, которые сами располагаются с преимуществом на
местности, чтобы выполнять удалённые атаки и так далее. Этого мы не будем
программировать здесь, но об этом стоит подумать.
Для того, чтобы персонаж Monster двигался на игрока, нам нужно динамически
обновлять направление двигающегося персонажа Monster в каждом кадре. Чтобы
обновлять направление, в котором расположен монстр, мы пишем код в методе
Monster::Tick().
Функция Tick запускается в каждом кадре игры. Запись
функции Tick такова:
virtual void Tick(float DeltaSeconds) override;
Вам нужно добавить прототип этой
функции в ваш класс AMonster, в вашем файле
Monster.h. Если мы подменяем Tick, мы можем устроить своё собственное
поведение, которое персонаж Monster должен выполнять в каждом кадре. Вот
базовый код который будет двигать монстра на игрока в течении каждого кадра:
void AMonster::Tick(float DeltaSeconds)
{
Super::Tick( DeltaSeconds );
//
базовый интеллект: двигает монстра на игрока
AAvatar *avatar = Cast
( UGameplayStatics::GetPlayerPawn(GetWorld(), 0) );
if( !avatar ) return;
FVector toPlayer = avatar->GetActorLocation() - GetActorLocation();
toPlayer.Normalize(); // reduce to unit vector
//
Собственно двигаем монстра на игрока
AddMovementInput(toPlayer, Speed*DeltaSeconds);
// Обращение лицом к цели
// Получаете ротатор для поворачивания того,
//
что смотрит в направлении игрока `toPlayer`
FRotator toPlayerRotation = toPlayer.Rotation();
toPlayerRotation.Pitch = 0; // 0 off the pitch
RootComponent->SetWorldRotation( toPlayerRotation );
}
232 |
С т р а н и ц а
Чтобы работало AddMovementInput, у вас должен быть выбран контроллер внизу
панели
AIController Class в вашем блупринте, как показано на следующем
скриншоте:
Если у вас выбрано None (ничего), то вызов AddMovementInput не будет иметь
никакого эффекта. Чтобы предотвратить это, выберите либо класс AIController,
либо класс PlayerController в качестве вашего
AIController Class.
Предыдущий код очень простой. Он содержит самую базовую форму интеллекта
противника: просто движение на игрока посредством небольшого инкрементного
возрастания в каждом кадре.
Наша не особо интеллектуальная армия гонится за игроком
В результате серии кадров, монстр выслеживает и преследует игрока в уровне.
Чтобы понять, как это работает, вы должны помнить, что
функция Tick, в среднем
вызывается 60 раз в секунду. Что это значит? То что в каждом кадре, монстр
понемногу продвигается к игроку. Поскольку монстр движется очень маленькими
233 |
С т р а н и ц а
шажками, его действия выглядят плавными и продолжительными (в то время как
на самом деле, он делает маленькие скачки и прыжки в каждом кадре).
Детальная суть отслеживания: движение монстра в трёх наложенных кадрах
Подсказка
Почему монстр двигается 60 кадров в секунду? Из-за аппаратного ограничения.
Частота обновления типичного монитора составляет 60Гц, так что это действует как
практический ограничитель того, сколько обновлений в секунду имеет смысл.
Обновление частоты кадров быстрее, чем обновление частоты, возможно, но это в
этом не будет пользы для игр, так как вы будете видеть новую картинку только
каждую 1/60 секунды на большинстве компьютеров. Некоторые продвинутые
симуляторы физического моделирования выполняют почти 1,000 обновлений в
секунду. Но тут можно поспорить. Вам не нужно разрешение такого типа для игры
и вы займёте лишнее время ЦПУ предназначенное для того, чем будет
довольствоваться игрок, как например лучшие алгоритмы AI (искусственного
интеллекта). Некоторые более новые аппаратные устройства разгоняют частоту
обновления до 120 Гц (посмотрите игровые мониторы, но не говорите вашим
родителям, то сказал вам спустить все ваши деньги на это).
Достарыңызбен бөлісу: