(Unreal : 입문) 13. 충돌 기초

Posted by : at

Category : Unreal-entry


프로젝트세팅의 엔진-콜리전을 아래와 같이 설정한다.
참고로 Trace Channel 은 캐릭터나 오브젝트가 아니라 행동에 관한 충돌처리이다.
아래에서는 공격의 충돌처리에 관한 설정이다.

MyCharacter 프리셋을 아래와 같이 설정한다.

캐릭터의 콜리전 프리셋을 위에서 설정한 프리셋으로 설정

그런데 이렇게 바꾸면 모든 소스에서 바뀌지 않음.
블루프린트에서 바꿔보자

DECLARE_MULTICAST_DELEGATE(FOnAttackHit);

/**
 * 
 */
UCLASS()
class TESTUNREALENGINE_API UMyAnimInstance : public UAnimInstance
{
	// ...

public:
	FOnAttackHit OnAttackHit;
};

void UMyAnimInstance::AnimNotify_AttackHit()
{
	//UE_LOG(LogTemp, Log, TEXT("AnimNotify_AttackHit"));
	OnAttackHit.Broadcast();
    // 공격이 일어났을때 통보
}
// PostInitializeComponents()는 BeginPlay이후 시점으로
// Component가 다 호출된 이후의 시점을 의미한다.
void AMyCharacter::PostInitializeComponents()
{
	Super::PostInitializeComponents();

	AnimInstance = Cast<UMyAnimInstance>(GetMesh()->GetAnimInstance());
	if (AnimInstance)
	{
		AnimInstance->OnMontageEnded.AddDynamic(this, &AMyCharacter::OnAttackMontageEnded);

        // AttackCheck이 BroadCast를 하면 호출된다.
		AnimInstance->OnAttackHit.AddUObject(this, &AMyCharacter::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_GameTraceChannel2,   // 
		FCollisionShape::MakeSphere(AttackRadius),  // 콜리전 타입(구형)
		Params);        // 옵션

    // 피격이 되면 UI로 나타내보자
	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());
	}
}

About Taehyung Kim

안녕하세요? 8년차 현업 C++ 개발자 김태형이라고 합니다. 😁 C/C++을 사랑하며 다양한 사람과의 협업을 즐깁니다. ☕ 꾸준한 자기개발을 미덕이라 생각하며 노력중이며, 제가 얻은 지식을 홈페이지에 정리 중입니다. 좀 더 상세한 제 이력서 혹은 Private 프로젝트 접근 권한을 원하신다면 메일주세요. 😎

Star
Useful Links