267 |
С т р а н и ц а
if( TimeSinceLastStrike > AttackTimeout )
{
TimeSinceLastStrike = 0;
}
return; //
больше ничего не делаем
}
else
{
//
не в зоне досягаемости атаки, тогда идём к игроку
AddMovementInput(toPlayer, Speed*DeltaSeconds);
}
}
Функция
AMonster::Attack
относительно проста. Конечно, нам сначала нужно
добавить объявление прототипа в файле Monster.h, чтобы написать нашу функцию
в файле .cpp:
void AMonster::Attack(AActor* thing);
В Monster.cpp мы осуществляем функцию Attack, следующим образом:
void AMonster::Attack(AActor* thing)
{
if( MeleeWeapon )
{
//
код для взмахов рукопашным оружием, если
//
рукопашное оружие используется
MeleeWeapon->Swing();
}
else if( BPBullet )
{
// If a blueprint for a bullet to use was assigned,
// then use that. Note we wouldn't execute this code
// bullet firing code if a MeleeWeapon was equipped
FVector fwd = GetActorForwardVector();
FVector nozzle = GetMesh()->GetBoneLocation( "RightHand" );
nozzle += fwd
* 155;// двигаем её от монстра, так что
/
/ она не сталкивается с моделью монстра
FVector toOpponent = thing->GetActorLocation() - nozzle;
toOpponent.Normalize();
ABullet *bullet = GetWorld()->SpawnActor
( BPBullet, nozzle, RootComponent-
>GetComponentRotation());
if( bullet )
{
bullet->Firer = this;
bullet->ProxSphere->AddImpulse( fwd*BulletLaunchImpulse );
}
else
{
GEngine->AddOnScreenDebugMessage( 0, 5.f,
FColor::Yellow, "monster: no bullet actor could be spawned. is the bullet overlapping something?"
);
}
}
}
268 |
С т р а н и ц а
Мы оставляем код, который осуществляет рукопашную атаку. Предполагая, что
монстр не держит оружие для рукопашной атаки, мы затем проверяем установлен
ли элемент BPBullet. Если этот элемент установлен, то это значит, что монстр
создаст экземпляр BPBullet из блупринта класса и будет стрелять.
Обратите особое внимание на следующую строку:
ABullet *bullet = GetWorld()->SpawnActor
(BPBullet, nozzle, RootComponent-
>GetComponentRotation() );
Это то, как мы добавляем новый актор в мир. Функция SpawnActor() помещает
экземпляр UCLASS, который вы передали, в spawnLoc, с некоторыми начальными
ориентировками.
После того, как мы порождаем пулю, мы вызываем функцию AddImpulse() к её
переменной ProxSphere, чтобы запускать её вперёд.
Достарыңызбен бөлісу: