프로젝트세팅의 엔진-콜리전을 아래와 같이 설정한다.
참고로 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());
}
}