언리얼4 C++ 몬스터 행동 패턴 추가하기
Intro
- 보스 몬스터 행동패턴 추가와 랜덤 실행
새로운 공격 추가
몽타주 추가
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE2(TEXT("공격 몽타주2"));
if (ATTACK_MONTAGE2.Succeeded())
{
AttackMontage2 = ATTACK_MONTAGE2.Object;
}
static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE3(TEXT("공격 몽타주3'"));
if (ATTACK_MONTAGE3.Succeeded())
{
AttackMontage3 = ATTACK_MONTAGE3.Object;
}
몽타주 실행 함수 추가
void UBossZombieAnimInstance::PlayAttackMontage2()
{
Montage_Play(AttackMontage2, 1.0f);
}
void UBossZombieAnimInstance::PlayAttackMontage3()
{
Montage_Play(AttackMontage3, 1.0f);
}
AnimNotify 추가
void UBossZombieAnimInstance::AnimNotify_AttackHitCheck2()
{
OnAttackHitCheck2.Broadcast();
}
void UBossZombieAnimInstance::AnimNotify_AttackHitCheck3()
{
OnAttackHitCheck3.Broadcast();
}
각 공격에 맞는 AttackCheck
함수가 실행되도록 바인딩 해준다.
ZombieAnim->OnAttackHitCheck2.AddUObject(this, &ABossZombie::AttackCheck2);
ZombieAnim->OnAttackHitCheck3.AddUObject(this, &ABossZombie::AttackCheck3);
각 공격의 AttackCheck 추가
패턴2
void ABossZombie::AttackCheck2()
{
FHitResult HitResult;
FCollisionQueryParams Params;
Params.AddIgnoredActor(this);
bool bResult = GetWorld()->SweepSingleByChannel(
HitResult,
GetActorLocation(),
GetActorLocation() + GetActorForwardVector() * 180.0f,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel5,
FCollisionShape::MakeSphere(180.0f),
Params);
if (bResult)
{
if (HitResult.GetActor()->ActorHasTag("Player"))
{
FDamageEvent DamageEvent;
// 데미지전달
HitResult.Actor->TakeDamage(50, DamageEvent, GetController(), this);
}
}
}
패턴3
void ABossZombie::AttackCheck3()
{
Attack3_Particle(); // 파티클 토글
FHitResult HitResult;
FCollisionQueryParams Params;
Params.AddIgnoredActor(this);
bool bResult = GetWorld()->SweepSingleByChannel(
HitResult,
GetActorLocation(),
GetActorLocation() + GetActorForwardVector() * 280.0f,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel5,
FCollisionShape::MakeSphere(280.0f),
Params);
if (bResult)
{
if (HitResult.GetActor()->ActorHasTag("Player"))
{
FDamageEvent DamageEvent;
// 데미지전달
HitResult.Actor->TakeDamage(80, DamageEvent, GetController(), this);
}
}
}
각 공격마다 데미지와 공격범위를 수정해주었고 AttackCheck3
는 추가로 파티클을 발생시키도록 했다.
Task 추가
기존에 있던 태스크에서 실행하는 애니메이션값만 수정하여 2개의 추가 Task를 만들었다.
비헤이비어 트리 수정
블랙보드 키 값 추가
int형 키 값 TaskNumber 추가
서비스 추가
키 값을 랜덤으로 발생 시키도록 하는 서비스 추가
변수 SelectNumber의 유형은 Blackboard Key로 해주었다.
Selector에 서비스를 부착시키고 Select Number를 TaskNumber로 교체해준다음 Call Tick on Search Start에 체크하여 검색 시작시 틱 이벤트를 호출하도록 했다.
테스크 추가
만들어둔 공격 테스크를 각각 추가시킨다음 블랙보드의 TaskNumber 값에 따라 테스크를 선택하도록 하여 랜덤으로 행동하도록 했다.
실행결과
공격 애니메이션이 랜덤으로 실행되고 범위와 데미지가 다르게 구현됨
댓글남기기