콜리전 트레이싱 함수
콜리전 트레이싱을 하기 위해서는
세 가지 카테고리를 함수 이름에 작성해주어야 한다
ex. {처리방법}{대상}{처리설정}
처리방법
LineTrace-/BoxTrace-/SphereTrace-/CapsuleTrace-/…
Sweep-
Overlap-
대상
Test: 무언가 감지 되었는지를 테스트
Single 또는 AnyTest: 감지된 단일 물체 정보를 반환
Multi: 감지된 모든 물체 정보를 배열로 반환
처리설정
ByChannel: 채널 정보를 사용해서 감지
ByObjectType: 물체에 지정된 오브젝트 타입(콜리전 채널) 정보를 사용해 감지
ByProfile: 프로파일(콜리전 프리셋) 정보를 사용해서 감지
캐릭터 공격의 충돌 감지 예시
캐릭터의 위치에서 시선 방향으로 물체가 있는지 감지하는 경우에는
작은 구체를 제작하고 시선 방향으로 특정 거리까지 쓸게 하는 Sweep,
하나의 물체만 감지하는 Single,
트레이스 채널을 사용해서 감지 ByChannel을 작성해
SweepSingleByChannel로 함수명을 작성하면 된다
트레이스 채널 추가 방법
Toolbar > Settings > Project Settings > Collision > Trace Channels
New Trace Channel > 원하는 채널이름을 작성하여 추가하면 된다
그리고 본인의 상황에 맞게 Default Response와 Preset을 설정하면 된다
예를 들어 Attack을 탐지하는 트레이스인 경우에는
Default Response는 Ignore로 하고
Preset 섹션에서 SCharacter를 더블 클릭해서 Attack은 Block으로 지정해서
충돌이 되게 만들어 주면 된다
오브젝트 및 트레이스 채널 확인법
충돌 함수의 인자로 채널의 Enum값이 필요하다
이를 확인하는 방법은
프로젝트 폴더 > Config > DefaultEngine.ini에서 본인이 만든 채널을 검색해서
열거형을 찾으면 된다
아래의 사진에서 Attack은 ECC_GameTraceChannel2 열거형을 배정이 되었다
콜리전 트레이싱 함수 예시 코드
// SPlayerCharacter.cpp
...
void ASPlayerCharacter::OnCheckHit()
{
FHitResult HitResult;
FCollisionQueryParams Params(NAME_None, false, this);
bool bResult = GetWorld()->SweepSingleByChannel(
HitResult,
GetActorLocation(),
GetActorLocation() + MeleeAttackRange * GetActorForwardVector(),
FQuat::Identity,
ECC_GameTraceChannel2,
FCollisionShape::MakeSphere(MeleeAttackRadius),
Params
);
if (true == bResult)
{
if (true == ::IsValid(HitResult.GetActor()))
{
UKismetSystemLibrary::PrintString(this, FString::Printf(TEXT("Hit Actor Name: %s"), *HitResult.GetActor()->GetName()));
}
}
}
...
콜리전 트레이싱 함수 내부
SweepSingleByChannel() 함수를 예시로 든다면
트레이스 채널을 사용해서 물리적 충돌 여부를 가리는 함수이다
물리는 월드의 기능이기에 GetWorld() 함수를 사용해서 불러온다
해당 함수는 기본 도형을 인자로 받은 후 시작 지점에서 끝 지점까지 쓸면서
해당 영역 내에 물리 판정이 일어났는지 확인한다
HitResult
물리적 충돌이 탐지된 경우 관련된 정보를 담을 구조체이다
만약, FHitResult의 Actor 속성 선언이 로우 포인터라면
해당 함수에서의 참조로 인해 제거 되어야 할 액터가 메모리에 그대로 남아 있게 된다
따라서, FHitResult는 참조로부터 자유롭게 포인터 정보를 전달해 주는
TWeakObjectPtr 자료형으로 Actor 속성이 선언되었다
TWeakObjectPtr로 지정된 액터에 접근하려면 반드시 IsValid() 함수를 사용해서
사용하려는 액터가 유효한지 점검하고 사용해야 는 점을 유의하자
Start
탐색을 시작할 위치이다
End
탐색을 끝낼 위치이다
Rot
탐색에 사용할 도형의 회전이다
TraceChannel
물리 충돌 감지에 사용할 트레이스 채널 정보이다
CollisionShape
탐색에 사용할 기본 도형 정보. 구체, 캡슐, 박스,...
Params
탐색 방법에 대한 설정 값을 모아둔 구조체이다
FCollisionQueryParams를 생성하기 위한 핵심 인자들은 아래와 같다
- InTraceTag
트레이스 태그를 작성해서 쉽게 디버깅에 활용할 수 있다
- bInTraceComplex
액터의 콜리전을 단순한 ShapeComponent가 아닌
스태틱 매쉬에 최대한 가깝게 생성을 하기위해
아래의 사진처럼 Convert Boxes to Convex와 같은 설정을 했다면
복잡한 충돌 처리를 해줘야하기에 true로 작성해야 한다
- InIgnoreActor
충돌을 무시할 액터를 작성해 주면 되고
일반적으로는 자기 자신과의 충돌을 허용하는지 않기에
this를 작성하며 된다
'게임 엔진 > [코드조선] 언리얼' 카테고리의 다른 글
언리얼 Damage Framework - TakeDamage 함수 (0) | 2024.05.15 |
---|---|
언리얼 Collision - Draw Debug (+ Console Command) (0) | 2024.05.15 |
언리얼 Collision - 충돌 설정 (0) | 2024.05.15 |
언리얼 Animation - Animation Notify (0) | 2024.05.14 |
언리얼 Animation - Animation Montage (0) | 2024.05.14 |