본문 바로가기
언리얼 엔진/기초

[Unreal Engine5] 무기 매커니즘 만들기(3) - 다단히트 없애기

by TyT. 2023. 8. 24.
반응형

GitHub: https://github.com/tyt0815

 

tyt0815 - Overview

tyt0815 has 4 repositories available. Follow their code on GitHub.

github.com

Notion: https://www.notion.so/tyt0815/a16514d41cb240f08aa19fe5b4c0ab86?pvs=4 

 

언리얼 엔진

Unreal Engine 5 C++ The Ultimate Game Developer Course

www.notion.so

※노션에 기존에 작성하던 글이 있으니 참고

 

이전까지 글을 따라왔다면, 아마 적캐릭터의 메시에따라 다를텐데 한번공격할때 여러번 히트가 되는 다단히트 현상을 겪으신 분들이 있을겁니다. 그 이유는 'BegineOverlap'을 사용하기 때문인데 요컨데 적 캐릭터의 메시에서 공격이 지나가면서 Overlap을 한번 빠져나갔다가 다시 Overlap되었기 때문에 발생하는 현상입니다. 이것을 한번 고쳐보겠습니다.

무기 클래스

이전 글을 따라왔다면 OnBoxOverlap함수에서 ActorsToIgnore를 선언하고 this(무기)만 배열에 넣고 박스트레이스에서 활용되었다는걸 알 수 있습니다.이 ActorsToIgnore배열에 한번 닿았던 적을 추가로 넣어 공격이 끝날때 초기화시키는 방식으로 메커니즘이 이루어 질 것 입니다.

먼저 배열을 추가해 줍니다.

public:
	TArray<AActor*> IgnoreActors;

이제 OnBoxOverlap 함수를 수정해 줍니다.

void AWeapon::OnBoxOverlap(UPrimitiveComponent* OverlappedComponent, AActor* OtherActor, UPrimitiveComponent* OtherComp, int32 OtherBodyIndex, bool bFromSweep, const FHitResult& SweepResult)
{
	const FVector Start = BoxTraceStart->GetComponentLocation();
	const FVector End = BoxTraceEnd->GetComponentLocation();

	TArray<AActor*> ActorsToIgnore;
	ActorsToIgnore.Add(this);
	//수정된 부분
	for (AActor* Actor : IgnoreActors)
	{
		ActorsToIgnore.AddUnique(Actor);
	}
	//
	FHitResult BoxHit;
	UKismetSystemLibrary::BoxTraceSingle(
		this, 
		Start, 
		End, 
		FVector(5.f, 5.f, 5.f),
		BoxTraceStart->GetComponentRotation(),
		ETraceTypeQuery::TraceTypeQuery1,
		false,
		ActorsToIgnore,
		EDrawDebugTrace::ForDuration,
		BoxHit,
		true
		);
	// 수정된 부분
	if (BoxHit.GetActor())
	{
		IgnoreActors.AddUnique(BoxHit.GetActor());
	}
}

 

플레이어 캐릭터 클래스

캐릭터 클래스로 와서 공격을 시작할때 무기 클래스의 IgnoreActors배열을 초기화해주는 코드를 만들어 줍니다.

void ABaseCharacter::SetWeaponCollsionEnable(ECollisionEnabled::Type CollisionEnabled)
{
	if (CurrentWeapon != nullptr && CurrentWeapon->GetWeaponBox() != nullptr)
	{
		CurrentWeapon->GetWeaponBox()->SetCollisionEnabled(CollisionEnabled);
		CurrentWeapon->IgnoreActors.Empty();  // 초기화
	}
}

컴파일하고 실행해서 확인해 봅니다.

반응형