F를 누르면 펀치와 킥 중 하나가 랜덤으로 나가는 것까지 구현했었다.
적 모델링을 임포트한 김에, 근접 공격의 판정을 만들어보았다.
아래 이미지는 현재 펀치와 킥 모션이다.
각각 왼손, 오른발로 공격한다.
따라서 이 두 부위에 히트박스를 만들어주어야 한다.
히트박스는 블루프린트에서든 C++에서든 만들 수 있는데, 이번엔 C++로 만들어보았다.
헤더에 선언한 USphereComponent 포인터. USphereComponent는 구형 콜라이더이다. 즉 히트박스이다.
UPROPERTY(EditDefaultsOnly, Category = Hitbox)
USphereComponent* PunchHitbox;
UPROPERTY(EditDefaultsOnly, Category = Hitbox)
USphereComponent* KickHitbox;
.cpp에서 히트박스 관련 셋업을 마쳤다.
//근접공격 히트박스 셋업
PunchHitbox = CreateDefaultSubobject<USphereComponent>(TEXT("PunchHitbox"));
KickHitbox = CreateDefaultSubobject<USphereComponent>(TEXT("KickHitbox"));
//소켓에 부착
PunchHitbox->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetIncludingScale, TEXT("LeftHand"));
ickHitbox->AttachToComponent(GetMesh(), FAttachmentTransformRules::SnapToTargetIncludingScale, TEXT("RightFoot"));
//범위 설정
PunchHitbox->SetSphereRadius(50.f);
KickHitbox->SetSphereRadius(50.f);
//충돌판정 없음이 기본
PunchHitbox->SetCollisionEnabled(ECollisionEnabled::NoCollision);
KickHitbox->SetCollisionEnabled(ECollisionEnabled::NoCollision);
각 포인터에 실제 SphereComponent를 생성하여 할당하고, 알맞은 소켓에 부착하였다.
소켓의 이름에 LeftHand, RightFoot이 들어간 것을 볼 수 있다.
히트박스의 크기는 50으로 다소 크게 설정했다.
TPS게임인 만큼 근접공격 판정은 일부러 널널하게 하였다.
그리고 SetCollisionEnabled 함수로 충돌판정을 없애놓은 것을 볼 수 있다.
이는 필수적인데, 충돌 판정이 기본적으로 켜져있다면 공격을 하지 않는데 단순히 배회하는 것만으로 콜라이더가 겹쳐 공격 판정이 일어날 수 있다.
공격 판정은 애니메이션 내부에서 Notify를 통해 조작할 것이다.
그 이전에, 우선 히트박스 충돌 감지 시 호출될 콜백 함수를 만들고, Overlap 델리게이트(이벤트)에 바인딩 시키는 작업을 하였다.
우선 콜백 함수를 다음과 같이 작성하였다.
선언:
UFUNCTION(BlueprintNativeEvent)
void OnHitboxOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
구현:
void AKannaCharacter::OnHitboxOverlap_Implementation(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
UE_LOG(LogTemp, Log, TEXT("%s"), *(OverlappedComponent->GetName()));
}
UFUNCTION 매크로의 인자로 BlueprintNativeEvent가 들어가있고, 구현부 함수 이름이 조금 다른 것을 볼 수 있는데, 이는 블루프린트에서 C++ 함수의 확장, 혹은 대체를 할 수 있는 BlueprintNativeEvent의 기능을 사용하기 위해서이다.
자세한 내용은 이전의 포스팅에 있다. https://ciel45.tistory.com/20
그리고 BeginPlay 함수 안에서 OnHitboxOverlap()을 히트박스 Overlap 델리게이트에 바인딩해주었다.
PunchHitbox->OnComponentBeginOverlap.AddDynamic(this, &AKannaCharacter::OnHitboxOverlap);
KickHitbox->OnComponentBeginOverlap.AddDynamic(this, &AKannaCharacter::OnHitboxOverlap);
OnComponentBeginOverlap 델리게이트(이벤트)의 AddDynamic 함수를 이용하여 콜백함수를 바인딩해줄 수 있다.
OnComponentBeginOverlap은 유니티의 OnTriggerEnter / OnColliderEnter와 같은 역할을 한다.
현재는 단순히 히트박스 overlap 발생 시 해당 히트박스의 이름을 출력하도록 한 것을 볼 수 있다.
BlueprintNativeEvent를 사용한 이유는 블루프린트에서 카메라 워킹 기능을 추가적으로 만들어주기 위해서였다.
이제 근접공격이 히트한 경우에는 카메라가 역동적으로 움직일 것이다.
이번엔 애니메이션 Notify를 통해 히트박스가 켜지고 꺼지도록 할 것이다.
애니메이션을 돌려보며 주먹이 빠르게 나가고 멈추는 시점, 킥이 나가고 멈추는 시점에 맞춰 Notify를 각각 만들어준다.
이제 애니메이션 블루프린트에서 각 Notify마다 적절한 함수(펀치/킥 히트박스를 켤지/끌지)를 호출하도록 해야 한다.
해당 함수는 캐릭터 C++ 클래스 내에서 UFUNCTION(BlueprintCallable)로 작성하였다. 애니메이션 블루프린트의 이벤트 그래프에서 호출해야 하기 때문이다.
void AKannaCharacter::SetPunchHitbox(ECollisionEnabled::Type CollisionEnabled)
{
if (PunchHitbox) //널 체크
PunchHitbox->SetCollisionEnabled(CollisionEnabled);
}
void AKannaCharacter::SetKickHitbox(ECollisionEnabled::Type CollisionEnabled)
{
if (KickHitbox) //널 체크
KickHitbox->SetCollisionEnabled(CollisionEnabled);
}
히트박스를 On/Off 하는 함수이다. 파라미터로 ECollisionEnabled 열거형을 받아, 이를 히트박스의 콜리전으로 설정해준다.
이제 이 함수를 이벤트 그래프에서 호출하면 된다.
여기서 히트박스를 켤 때는 Query Only를 사용한 것을 볼 수 있다.
히트박스가 적과 겹쳤는지 판정(Overlap)하는 것은 필요하지만, 히트박스 자체를 이용하여 적에게 물리적인 영향을 주고싶지는 않기에 Query Only로 해둔 것이다.
이전 포스팅에 관련 내용이 있다.
마지막으로 히트박스와 적의 콜리전 세팅을 손봐줘야 한다.
기본적으로 히트박스는 플레이어 자신과의 충돌은 무시해야 한다. 자기 주먹으로 자신을 때리는 일이 없도록 하기 위해서이다.
이를 위해서 히트박스의 Collision Presets를 Custom으로 변경한 뒤, 내부 세부 설정에서 Pawn 타입 콜리전을 무시하도록 하였다.
다만 적도 기본적으로 콜리전 오브젝트 타입이 Pawn이다.
따라서 적의 Collision Presets 역시 Custom으로 하여 세부 설정 권한을 열어준 뒤, 오브젝트 타입을 WorldDynamic으로 바꾸었다.
WorldDynamic은 월드에서 동적으로 움직이는 메쉬라는 의미로, 적 타입에 적용하기 적합하다.
히트박스는 Pawn만을 무시하므로, 적과는 충돌판정이 잘 일어날 것이다.
아래는 테스트 영상이다. 공격 히트 시 카메라 워킹, 아래 로그의 내용에 주목해보자.
'언리얼 엔진 5 > 개발 일지' 카테고리의 다른 글
[UE5] 블루아카이브 TPS게임 개발일지 (11) - 라인 트레이싱 (0) | 2023.12.19 |
---|---|
[UE5] 블루아카이브 TPS게임 개발일지 (10) - 사격 기능 구현 준비 작업 + DIP (2) | 2023.12.18 |
[UE5] 블루아카이브 TPS게임 개발일지 (8) - 적 모델링 임포트 (4) | 2023.12.18 |
[UE5] 블루아카이브 TPS게임 개발일지 (7.5) - 사격 애니메이션 추가(Additive Animation) (0) | 2023.12.18 |
[UE5] 블루아카이브 TPS게임 개발일지 (7) - Aim Offset (0) | 2023.12.16 |