- 전사의 콤보 공격 판정은 초보자와 다르게 구현해보도록 하겠습니다.
- 무기에 부착한 콜라이더의 충돌 설정을 On/Off 하여 공격 판정
- 기존에 플레이어의 무기 정보를 가져오기 위해 사용했던 Interface를 재사용하도록 하겠습니다.
// UAnimNotify_MMEnableCollision Cpp
#include "Animation/AnimNotify_MMEnableCollision.h"
#include "Interface/MMAnimationWeaponInterface.h"
#include "Item/MMWeapon.h"
void UAnimNotify_MMEnableCollision::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference)
{
Super::Notify(MeshComp, Animation, EventReference);
if (MeshComp)
{
// 콜리전 On
IMMAnimationWeaponInterface* WeaponPawn = Cast<IMMAnimationWeaponInterface>(MeshComp->GetOwner());
if (WeaponPawn)
{
WeaponPawn->GetWeapon()->EnableCollision();
}
}
}
// AnimNotify_MMDisableCollision Cpp
#include "Animation/AnimNotify_MMDisableCollision.h"
#include "Interface/MMAnimationWeaponInterface.h"
#include "Item/MMWeapon.h"
void UAnimNotify_MMDisableCollision::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference)
{
Super::Notify(MeshComp, Animation, EventReference);
if (MeshComp)
{
// 콜리전 Off
IMMAnimationWeaponInterface* WeaponPawn = Cast<IMMAnimationWeaponInterface>(MeshComp->GetOwner());
if (WeaponPawn)
{
WeaponPawn->GetWeapon()->DisableCollision();
}
}
}
- MMWeapon Class에 DisableCollision(), EnableCollision() 함수를 작성합니다.
// MMWeapon Header
public:
void EnableCollision();
void DisableCollision();
// MMWeapon Cpp
void AMMWeapon::EnableCollision()
{
// 충돌 체크 On
WeaponCollision->SetCollisionEnabled(ECollisionEnabled::QueryOnly);
UE_LOG(LogTemp, Warning, TEXT("On"));
}
void AMMWeapon::DisableCollision()
{
// 충돌 체크 Off
WeaponCollision->SetCollisionEnabled(ECollisionEnabled::NoCollision);
UE_LOG(LogTemp, Warning, TEXT("Off"));
}
- 작성한 Notify들을 Warrior 콤보 공격 몽타주에 추가해주도록 합니다.
- 충돌을 판정하기 위해 Weapon에 부착된 SphereComponent와 충돌 이벤트를 매핑해야 합니다.
- OnComponentBeginOverlap 이벤트를 사용합니다.
// MMWeapon Header
protected:
virtual void PostInitializeComponents() override;
UFUNCTION()
void OnBeginOverlap(class UPrimitiveComponent* OverlappedComp, class AActor* OtherActor, class UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult);
// MMWeapon Cpp
void AMMWeapon::PostInitializeComponents()
{
Super::PostInitializeComponents();
// Event Mapping
WeaponCollision->OnComponentBeginOverlap.AddDynamic(this, &AMMWeapon::OnBeginOverlap);
}
void AMMWeapon::OnBeginOverlap(UPrimitiveComponent* OverlappedComp, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
if (Owner == OtherActor) return;
UE_LOG(LogTemp, Warning, TEXT("%s"), *OtherActor->GetName());
}
플레이어의 직업 종류는 전사, 궁수, 마법사로 구분됩니다.
- 전사의 경우 무기의 리치 덕분에 위와 같은 On/Off판정이 가능합니다.
- 마법사와 궁수의 경우 공격 거리가 마땅치 않아 초보자 방식으로 체크를 해줄 예정입니다.
- 즉, WeaponCollision은 MMSwordWeapon에만 필요한 존재입니다.
클래스 구조를 수정해주도록 하겠습니다.