Unreal/언리얼 엔진 4 입문
[언리얼 입문] 충돌 기초
잡템
2023. 10. 26. 22:15
충돌 설정
충돌관련 설정은 프로젝트 세팅 - 콜리전 에서 할수 있다.
유니티에서 레이어 기반으로 충돌을 설정하는 부분과 비슷해보인다.
오브젝트 채널 : 콜리전 영역에 지정하는 콜리전 채널 (WorldStatic, WorldDynamic, Pawn, PhysicsBody, Vehicle, Destructible)
트레이스 채널 : 어떤 행동에 설정하는 콜리전 채널 (Visibility, Camera)
충돌에 대한 처리는 유니티와 비교했을때 좀더 복잡하다.
유니티의 경우 무기공격에대한 충돌체크를 구현시 쉽게한다면 무기에 부착되있는 콜라이더에 OnCollisionEnter() 함수를 이용해 간단히 충돌체크를 하면되지만.
언리얼의경우 따로 만들어진 함수가없어 직접 생성해야된다.
/*애니메이션 헤더*/
//델리게이트 생성
DECLARE_MULTICAST_DELEGATE(FOnAttackHit);
/*애니메이션 CPP*/
void UMyAnimInstance::AnimNotify_AttackHit()
{
//델리게이트 실행
OnAttackHit.Broadcast();
}
/*캐릭터 CPP*/
//델리게이트 등록
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 isCollision = GetWorld()->SweepSingleByChannel(
OUT HitResult,
GetActorLocation(),
GetActorLocation() + GetActorForwardVector() * AttackRange,
FQuat::Identity,
ECollisionChannel::ECC_GameTraceChannel2,
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(isCollision)
DrawColor = FColor::Green;
else
DrawColor = FColor::Red;
DrawDebugCapsule(GetWorld(),Center, HalfHeight, AttackRadius, Rotation, DrawColor, false, 2.f);
if(isCollision && HitResult.Actor.IsValid())
{
UE_LOG(LogTemp,Log,TEXT("Hit Actor : %s"), *HitResult.Actor->GetName());
}
}