[UE5 C++] 무기 콤보 공격 판정

LeeTaes·2024년 5월 3일
0

[UE_Project] MysticMaze

목록 보기
9/17

언리얼 엔진을 사용한 RPG 프로젝트 만들기

  • 전사의 콤보 공격 판정은 초보자와 다르게 구현해보도록 하겠습니다.
    - 무기에 부착한 콜라이더의 충돌 설정을 On/Off 하여 공격 판정

Collision을 On/Off하기 위한 AnimNotify 제작

  • 기존에 플레이어의 무기 정보를 가져오기 위해 사용했던 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"));
}

몽타주에 AnimNotify 추가하고, 충돌 판정 테스트하기

  • 작성한 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에만 필요한 존재입니다.

클래스 구조를 수정해주도록 하겠습니다.

  • 기존 MMWeapon에 존재하던 Enable/DisableCollision, WeaponCollision, BeginOverlap 함수들을 MMSwordWeapon에 옮겨주도록 합니다.


profile
클라이언트 프로그래머 지망생

0개의 댓글