프로젝트 기간 : 25.02.17 ~ 25.03.05 (약 3주)
1. 개요
근거리, 원거리 적 구현을 마무리 하고 다음 구현으로 넘어가기 위해 적 AI에 대해 마무리 구현을 진행했습니다. 정신없이 개발을 하다보니 포스트가 늦었네요 ㅎㅎ.. 4일동안 꽤 많은 작업을 진행했는데 그 중에서도 적 AI 마무리 구현에 대해서 포스트를 진행할 예정입니다.
2. 적 - 플레이어 충돌 무시 처리
이전에는 플레이어와 적 사이에 충돌을 처리하게 되어 있어서 플레이어가 다수의 적을 마주했을 때 가로막히는 현상이 있었습니다. 사용자 입장에서 조금 답답함을 느낄 수 있겠다 싶어서 플레이어와 적 사이의 충돌을 무시하도록 수정해주었습니다 !
플레이어가 적과 충돌을 무시하고 통과하는 모습을 볼 수 있습니다 ~~
3. 문제 발생
충돌 무시 구현이 잘 돼서 좋아하고 있었는데, 로그 출력 창이 살짝 허전한 느낌이 들더라구요 .. 그래서 보니까 근거리 적이 공격하고 있다는 로그가 출력이 안 되고 있다는 것을 확인했습니다 ! 생각해보니 적과의 충돌을 무시하니까 공격 판정도 당연히 무시가 되겠구나 싶었습니다 ! 공격 판정을 SweepSingle로 구현을 했기 때문에 당연한 결과였습니다.
4. 해결
해결 방법으로 떠올린 첫 번째 방법은 SweepSingle 을 Overlap 판정으로 바꿔보자 ! 였습니다. 하지만 이렇게 될 경우 적의 Capsule Collider에 대해서 Overlap 이벤트를 판단하기 때문에 겹치지 않는 이상 근거리 적이 공격을 할 때 Overlap 이벤트가 발생하지 않을 겁니다.
두번 째 방법은 공격 판정을 위한 Collider를 따로 두자 ! 였습니다. 구현이 살짝 번거로워지긴 했지만, 적과의 충돌은 무시하되 공격에 대해서는 Overlap 판정을 해야하기 때문에 합리적인 접근이라고 생각했습니다.
MeleeMonster.h
protected:
/** 타격 체크용 캡슐 컴포넌트 */
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category="Stat")
UCapsuleComponent* AttackRangeComponent;
protected:
/** 공격 범위에 플레이어가 있는지 확인 */
UFUNCTION()
void OnAttackRangeOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
MeleeMonster.cpp
AMeleeMonster::AMeleeMonster()
{
PrimaryActorTick.bCanEverTick = true;
// 공격 범위 컴포넌트 생성
AttackRangeComponent = CreateDefaultSubobject<UCapsuleComponent>(TEXT("AttackRangeComponent"));
AttackRangeComponent->SetupAttachment(RootComponent);
// 공격 범위 크기 및 위치 설정
AttackRangeComponent->InitCapsuleSize(90, 90);
AttackRangeComponent->SetRelativeLocation(FVector(120.0f, 0.0f, 0.0f));
// 충돌만 허용
AttackRangeComponent->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
// 오버랩 채널로 설정
AttackRangeComponent->SetCollisionResponseToAllChannels(ECR_Ignore);
AttackRangeComponent->SetCollisionResponseToChannel(ECC_GameTraceChannel1, ECR_Overlap);
// 오버랩 이벤트 바인딩
AttackRangeComponent->OnComponentBeginOverlap.AddDynamic(this, &AMeleeMonster::OnAttackRangeOverlap);
}
void AMeleeMonster::Attack()
{
// 공격 로직이 한 번 실행됐을 경우 return
if (bIsAttacked) return;
bIsAttacked = true;
// 공격 후 콜리전 비활성화
AttackRangeComponent->SetCollisionEnabled(ECollisionEnabled::Type::QueryOnly);
}
void AMeleeMonster::OnAttackRangeOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor,
UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (OtherActor && OtherActor->ActorHasTag("Player"))
{
GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::Printf(TEXT("Enemy Attacked !")));
}
}
그렇게 수정된 근거리 적 코드 .. 생성자에서 캡슐 콜라이더를 초기화해주었고, 공격 시에 콜리전을 활성화 한 후 공격이 끝났을 때 콜리전을 다시 비활성화 하는 식으로 구현했습니다 !
결과
공격 시 로그가 야무지게 잘 뜨는 모습을 확인할 수 있습니다 ! 뿌듯하네여 !
'언리얼 엔진 > [팀프로젝트] The Fourth Descendant' 카테고리의 다른 글
[TheFourthDescendant] 05. 적 NavLink로 점프 구현 (0) | 2025.02.25 |
---|---|
[TheFourthDescendant] 03. 근거리 적 AI 구현 (0) | 2025.02.21 |
[TheFourthDescendant] 02. 원거리 적 AI 구현 (0) | 2025.02.20 |
[TheFourthDescendant] 01. 퍼스트 디센던트 모작의 시작 (1) | 2025.02.20 |