기타/Unreal

[Unreal BP & C++] Trace로 탐색하기

푸쿠이 2021. 4. 1. 15:54

 

참고 자료

제일 기본 공식 문서.

docs.unrealengine.com/ko/InteractiveExperiences/Tracing/index.html

 

레이캐스트와 트레이스

피직스 트레이스 홈 페이지입니다.

docs.unrealengine.com

조금 더 도움될 문서.

www.unrealengine.com/ko/blog/collision-filtering

 

언리얼 엔진 4 의 콜리전 필터링

무엇이 충돌하는지를 선택하는 것은 매우 중요하지만 까다로울 수 있으며, UE4 개발 도중 꽤 오래 논의를 거쳤던 문제입니다. 저희 시스템이 처음에는 약간 복잡해 보일 수는 있지만, 매우 강력

www.unrealengine.com

요것들을 이해했으면, 트레이스를 왜 사용하는지, 어떤 값을 제공해주는지 알았을 것이다.

직접 사용해보자. 나는 Line Trace를 사용했다.

 

블루프린트로 사용하기

블루프린트는 진짜 간단하다.

그냥 우클릭해서 사용하면 된다.

 

위의 참고 내용을 읽어봤으면, 각각의 노드가 뭘 의미하는 것인지 알 것이다.

나는 LineTraceForObjects 노드를 사용했고, 넣으라는 값 넣고 Hit Result 받아서 사용하면 된다.

 

C++로 사용하기

C++로 넘어오면 갑자기 복잡해진다.

BP처럼 넣으라는 값이 한 눈에 보이지 않기 때문에, 파라미터를 보고 값을 넣어줘야 한다.

(함수를 작성할 때, Ctrl + Shift + Space 하면 파라미터가 보인다.)

FVector CameraLoc = Camera->GetComponentLocation();
FVector CameraForward = Camera->GetForwardVector();
FVector StartLoc = CameraLoc; // 레이저 시작 지점.
FVector EndLoc = CameraLoc + (CameraForward * 5000.0f); // 레이저 끝나는 지점.


TArray<TEnumAsByte<EObjectTypeQuery>> ObjectTypes; // 히트 가능한 오브젝트 유형들.
TEnumAsByte<EObjectTypeQuery> WorldStatic = UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldStatic);
TEnumAsByte<EObjectTypeQuery> WorldDynamic = UEngineTypes::ConvertToObjectType(ECollisionChannel::ECC_WorldDynamic);
ObjectTypes.Add(WorldStatic);
ObjectTypes.Add(WorldDynamic);

TArray<AActor*> IgnoreActors; // 무시할 액터들.

FHitResult HitResult; // 히트 결과 값 받을 변수.

bool Result = UKismetSystemLibrary::LineTraceSingleForObjects(
	GetWorld(),
	StartLoc,
	EndLoc,
	ObjectTypes,
	false,
	IgnoreActors, // 무시할 것이 없다고해도 null을 넣을 수 없다.
	EDrawDebugTrace::ForDuration,
	HitResult,
	true
	// 여기 밑에 3개는 기본 값으로 제공됨. 바꾸려면 적으면 됨.
	//, FLinearColor::Red
	//, FLinearColor::Green
	//, 5.0f
);

if (Result == true)
{
	// FVector ImpactPoint = HitResult.ImpactPoint;
	// HitResult에서 필요한 값들을 사용하면 됨.
}

자료형들이 모두 처음 보는 것들이라 어색하다.

이렇게 쓰면 된다고 한다.