Mini

충돌 기초 본문

UE5

충돌 기초

Mini_96 2022. 8. 15. 18:30

* 콜리전 반응 종류

무시: 충돌X

겹침 : 충돌O, 지나가짐O  ex)메이플 포탈

불록 : 충돌O, 지나가짐X

 

* 충돌 구현

3. Preset에서 위부터 각각 MyCharacter를 Pawn 설정과 동일하게 설정.

4.BP_Mycharacter::캡슐::콜리전= MyCharacter

5.컴파일, 저장

 

* Attack 충돌시 할일 구현

1.엔진-콜리전-새 트레이스채널=Attack 추가

2.애님인스턴스에 변수추가

DECLARE_MULTICAST_DELEGATE(FOnAttackHit);
public:
	FOnAttackHit OnAttackHit;

3. 브로드캐스트 때리기(리스너 패턴)

Broadcast(c:소문자)

void UMyAnimInstance::AnimNotify_AttackHit()
{
	//UE_LOG(LogTemp, Log, TEXT("AnimNotify_AttackHit"));
	OnAttackHit.Broadcast();
}

 

- 리스너 패턴

나는 할일을한다(브로드캐스트 방송)

관심있는 사람은 메시지를 받아라(구독)

void AMyCharacter::BeginPlay()
{
	Super::BeginPlay();

	Animinstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
	Animinstance->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
	Animinstance->OnAttackHit.AddUObject(this, &AMyCharacter::AttackCheck);

}

4. OnAttackHit 이벤트 발생 ->  AttackCheck함수를 실행해라

 

※ 리팩토링

초기화부분 BeginPlay->PostInitializeComponents로 이전

=>비긴플레이 이전에 처리됨.

void AMyCharacter::PostInitializeComponents()
{
	Super::PostInitializeComponents();

	Animinstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
	if (Animinstance)
	{
		Animinstance->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);
		Animinstance->OnAttackHit.AddUObject(this, &AMyCharacter::AttackCheck);
	}
	


}

5.AttackCheck 구현

void AMyCharacter::AttackCheck()
{
	FHitResult HitResult;
	FCollisionQueryParams Params(NAME_None, false, this);

	float ATtackRange = 100.f;
	float ATtackRadius = 50.f;

	//피격 판정하는 함수
	bool bResult = GetWorld()->SweepSingleByChannel(
		OUT HitResult,	//결과물
		GetActorLocation(),	//탐색시작위치
		GetActorLocation() + GetActorForwardVector() * ATtackRange,	//탐색끝위치
		FQuat::Identity,	//사용할 도형회전
		ECollisionChannel::ECC_EngineTraceChannel2,	//사용할 채널정보 ::Attack 트레이스가 2번채널에 있음
		FCollisionShape::MakeSphere(ATtackRadius),	//탐지할 도형형태(구체,박스...)
		Params);

	//피격했고, 결과물이 유효하면
	if (bResult && HitResult.Actor.IsValid())
	{
		UE_LOG(LogTemp, Log, TEXT("Hit Actor: %s"), *HitResult.Actor->GetName());
	}

}

 

 

* 디버깅 도형 만들기 => 피격 디버깅

1.캐릭터::#include "DrawDebugHelpers.h"

2. 캐릭터::구현

void AMyCharacter::AttackCheck()
{
	FHitResult HitResult;
	FCollisionQueryParams Params(NAME_None, false, this);

	float AttackRange = 100.f;
	float AttackRadius = 50.f;

	//피격 판정하는 함수
	bool bResult = GetWorld()->SweepSingleByChannel(
		OUT HitResult,	//결과물
		GetActorLocation(),	//탐색시작위치
		GetActorLocation() + GetActorForwardVector() * AttackRange,	//탐색끝위치
		FQuat::Identity,	//사용할 도형회전
		ECollisionChannel::ECC_EngineTraceChannel2,	//사용할 채널정보 ::Attack 트레이스가 2번채널에 있음
		FCollisionShape::MakeSphere(AttackRadius),	//탐지할 도형형태(구체,박스...)
		Params);

	//피격디버그 도형
	FVector Vec = GetActorForwardVector() * AttackRange;
	FVector Center = GetActorLocation() + Vec * 0.5f;
	float HalfHeight = AttackRange * 0.5f + AttackRadius;
	FQuat Rotation = FRotationMatrix::MakeFromZ(Vec).ToQuat();
	FColor DrawColor;

	//피격이면 녹색, 아니면 빨간색
	if (bResult)
		DrawColor = FColor::Green;
	else
		DrawColor = FColor::Red;

	DrawDebugCapsule(GetWorld(), Center, HalfHeight, AttackRadius,
		Rotation, DrawColor, false, 2.f); //유지시간


	//피격했고, 결과물이 유효하면
	if (bResult && HitResult.Actor.IsValid())
	{
		UE_LOG(LogTemp, Log, TEXT("Hit Actor: %s"), *HitResult.Actor->GetName());
	}



}

'UE5' 카테고리의 다른 글

아이템 줍기  (0) 2022.08.16
소켓 실습  (0) 2022.08.15
블렌드 스페이스  (0) 2022.08.14
애니메이션 노티파이  (0) 2022.08.14
델레게이트  (0) 2022.08.14