Изучаем С++ создавая игры в ue4 Уилльям Шериф Изучайте программирование С++ с интересным применением реально мира, что позволит вам создавать ваши собственные игры!



Pdf көрінісі
бет209/252
Дата06.01.2022
өлшемі12,25 Mb.
#11940
1   ...   205   206   207   208   209   210   211   212   ...   252
Базовый интеллект монстров 
В  нашей  игре,  мы  добавим  только  базовый  интеллект  персонажам  Monster. 
Монстры будут знать, как делать две базовые вещи: 

 
Выслеживать игрока и преследовать его 

 
Атаковать игрока 


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  Гц  (посмотрите  игровые  мониторы,  но  не  говорите  вашим 
родителям,  то  сказал вам спустить все ваши деньги на это). 


Достарыңызбен бөлісу:
1   ...   205   206   207   208   209   210   211   212   ...   252




©emirsaba.org 2024
әкімшілігінің қараңыз

    Басты бет