[UE5] TIL - 32 <LineTraceSingleByChannel, ECollisionChannel>

ChangJin·2024년 5월 12일
0

Unreal Engine5

목록 보기
60/114
post-thumbnail

2024-05-12

깃허브!
https://github.com/ChangJin-Lee/ARproject
https://github.com/ChangJin-Lee/SimpleShooter

느낀점
ECollisionChannel Enum 변수에서 Channel에 따른 LineTrace 방법에 대해 학습했다. LineTraceSingleByChannel으로 Start Vector에서 End Vector 까지에서 원하는 Channel에 해당하는 HitResult를 FHitResult 타입으로 받아올 수 있었다.

TIL

  • LineTraceSingleByChannel
  • ECollisionChannel

LineTraceSingleByChannel

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/Engine/UWorld/LineTraceSingleByChannel?application_version=5.3


  • Trace a ray against the world using a specific channel and return the first blocking hit
  • 월드내에서 특정한 Channel에 해당하는 것들의 ray와 부딪친 결과를 검출합니다. 가장 먼저 부딪친 첫 번째 hit 결과만을 OutHit에 저장합니다.


  • World.h에는 다음과 같이 선언되어 있습니다.
  • 잘 읽어보면 Params, ResponseParam는 선택사항입니다.
  • OutHit, Start, End, TraceChannel가 반드시 필요합니다.
  • 잘 아는 것처럼 FHitResult로 선언한 변수를 OutHit 매개변수로 넘겨주면 됩니다.

/**
	 *  Trace a ray against the world using a specific channel and return the first blocking hit
	 *  @param  OutHit          First blocking hit found
	 *  @param  Start           Start location of the ray
	 *  @param  End             End location of the ray
	 *  @param  TraceChannel    The 'channel' that this ray is in, used to determine which components to hit
	 *  @param  Params          Additional parameters used for the trace
	 * 	@param 	ResponseParam	ResponseContainer to be used for this trace	 
	 *  @return TRUE if a blocking hit is found
	 */
	bool LineTraceSingleByChannel(struct FHitResult& OutHit,const FVector& Start,const FVector& End,ECollisionChannel TraceChannel,const FCollisionQueryParams& Params = FCollisionQueryParams::DefaultQueryParam, const FCollisionResponseParams& ResponseParam = FCollisionResponseParams::DefaultResponseParam) const;


  • 사용 예시는 다음과 같습니다.
  • End 위치는 이미 선언했다고 가정합니다.
  • Start 매개변수는 Location으로 이전에 할당했다고 가정합니다.
	// TODO: LineTrace
	FHitResult HitResult;
	bool bSuccess = GetWorld()->LineTraceSingleByChannel(HitResult, Location, End, ECollisionChannel::ECC_GameTraceChannel1);
	if(bSuccess)
	{
		UE_LOG(LogTemp, Warning, TEXT("Detect Bullet Hit!"));
		DrawDebugPoint(GetWorld(), HitResult.Location, 20, FColor::Red, true);
	}

  • 프로젝트 세팅 - 콜리전 - Trace Channels - Bullet 추가
  • 이후 프리셋을 원하는 대로 설정변경 하면 됩니다.



ECollisionChannel

https://docs.unrealengine.com/4.27/en-US/API/Runtime/Engine/Engine/ECollisionChannel/

  • 5.3에 내용이 없어서 4.27로 정리합니다.

  • NOTE!!Some of these values are used to index into FCollisionResponseContainers and must be kept in sync.
  • 몇 변수들은 FCollisionResponseContainers안의 인덱스를 사용하기 때문에 동기적으로 사용해야합니다.

  • EngineTypes.h 에는 다음과 같이 선언되어있습니다.
  • UENUM(BlueprintType)은 언리얼 열거형 타입입니다.
  • ECC_EngineTraceChannel1과 ECC_GameTraceChannel1는 다르다는 것에 주의합니다. 굉장히 닮아있지만 전혀 다른 채널입니다.

UENUM(BlueprintType)
enum ECollisionChannel : int
{

	ECC_WorldStatic UMETA(DisplayName="WorldStatic"),
	ECC_WorldDynamic UMETA(DisplayName="WorldDynamic"),
	ECC_Pawn UMETA(DisplayName="Pawn"),
	ECC_Visibility UMETA(DisplayName="Visibility" , TraceQuery="1"),
	ECC_Camera UMETA(DisplayName="Camera" , TraceQuery="1"),
	ECC_PhysicsBody UMETA(DisplayName="PhysicsBody"),
	ECC_Vehicle UMETA(DisplayName="Vehicle"),
	ECC_Destructible UMETA(DisplayName="Destructible"),

	/** Reserved for gizmo collision */
	ECC_EngineTraceChannel1 UMETA(Hidden),

	ECC_EngineTraceChannel2 UMETA(Hidden),
	ECC_EngineTraceChannel3 UMETA(Hidden),
	ECC_EngineTraceChannel4 UMETA(Hidden), 
	ECC_EngineTraceChannel5 UMETA(Hidden),
	ECC_EngineTraceChannel6 UMETA(Hidden),

	ECC_GameTraceChannel1 UMETA(Hidden),
	ECC_GameTraceChannel2 UMETA(Hidden),
	ECC_GameTraceChannel3 UMETA(Hidden),
	ECC_GameTraceChannel4 UMETA(Hidden),
	ECC_GameTraceChannel5 UMETA(Hidden),
	ECC_GameTraceChannel6 UMETA(Hidden),
	ECC_GameTraceChannel7 UMETA(Hidden),
	ECC_GameTraceChannel8 UMETA(Hidden),
	ECC_GameTraceChannel9 UMETA(Hidden),
	ECC_GameTraceChannel10 UMETA(Hidden),
	ECC_GameTraceChannel11 UMETA(Hidden),
	ECC_GameTraceChannel12 UMETA(Hidden),
	ECC_GameTraceChannel13 UMETA(Hidden),
	ECC_GameTraceChannel14 UMETA(Hidden),
	ECC_GameTraceChannel15 UMETA(Hidden),
	ECC_GameTraceChannel16 UMETA(Hidden),
	ECC_GameTraceChannel17 UMETA(Hidden),
	ECC_GameTraceChannel18 UMETA(Hidden),
	
	/** Add new serializeable channels above here (i.e. entries that exist in FCollisionResponseContainer) */
	/** Add only nonserialized/transient flags below */

	// NOTE!!!! THESE ARE BEING DEPRECATED BUT STILL THERE FOR BLUEPRINT. PLEASE DO NOT USE THEM IN CODE

	ECC_OverlapAll_Deprecated UMETA(Hidden),
	ECC_MAX,
};

profile
게임 프로그래머

0개의 댓글