236 |
С т р а н и ц а
P находится внутри сферы, когда d меньше чем r
Итак, в нашем коде, предыдущее изображение переходит в следующий код:
void AMonster::Tick(float DeltaSeconds)
{
Super::Tick( DeltaSeconds );
AAvatar *avatar = Cast
( UGameplayStatics::GetPlayerPawn(GetWorld(), 0) );
if( !avatar ) return;
FVector toPlayer = avatar->GetActorLocation() - GetActorLocation();
float distanceToPlayer = toPlayer.Size();
//
Если игрок не в SightSphere монстра,
//
идём назад
if( distanceToPlayer > SightSphere->GetScaledSphereRadius() )
{
//
Если игрок в не поля зрения,
//
то монстр не может гнаться за ним
return;
}
toPlayer /= distanceToPlayer; //
нормализуем вектор
//
Собственно двигаем монстра на игрока по немногу
AddMovementInput(toPlayer, Speed*DeltaSeconds);
// (
остальная часть функции такая же как прежде (вращение))
}
Этот кот добавляет дополнительный интеллект персонажу Monster. Персонаж
Monster сейчас может прекращать погоню за игроком, если игрок вне объекта
SightSphere монстра. Вот как будет выглядеть результат:
237 |
С т р а н и ц а
Хорошо было бы здесь внести сравнение расстояния в простую встроенную
функцию. Мы можем вести эти две встроенные
функции-члены в заголовочный
файл Monster:
inline bool isInSightRange( float d )
{
return d < SightSphere->GetScaledSphereRadius(); }
inline bool isInAttackRange( float d )
{ return d < AttackRangeSphere->GetScaledSphereRadius(); }
Эти
функции возвращают значение true, когда переданный параметр d внутри
рассматриваемой сферы.
Подсказка
Функция inline (встроенная) означает, что
функция больше походит на макрос, чем
на функцию. Макросы копируются и вставляются в вызываемую локацию, в то
время как
функции перепрыгивают по средством С++ и выполняются на своих
локациях. Встроенные
функции хороши, потому что они предоставляют хорошую
производительность, наряду с тем, что код остаётся лёгок для чтения, и их можно
использовать повторно.
Достарыңызбен бөлісу: