ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unreal Engine] Line trace
    Unreal Engine 5._ 2023. 4. 28. 18:19

    이번 글에서는 언리얼 엔진에서 직선적인 트레이싱을 수행하는 함수에 대해 알아보도록 하겠습니다.

     

    이번 글의 예제는 다음과 같은, 언리얼 엔진의 1인칭 기본 템플릿이 사용됩니다.

     


     

    1. 결과 미리보기

     

    더보기

    이번 글은 위와 같이, 간단한 레드 닷 효과를 구현합니다.

     

    2. Blueprint : Line Trace By Channel

     

    더보기

    블루프린트에서의 구현은 다음과 같습니다.

    Line Trace By Channel 노드를 통해, 시작점과 끝점을 지정하여 직선 트레이싱을 수행할 수 있습니다.

     

    3. C++ : UKismetSystemLibrary::LineTraceSingle

     

    더보기

    Blueprint를 C++로 구현하면 다음과 같습니다.

     

    FirstPersonCharacter.h

    ...
    class AFirstPersonCharacter : public ACharacter {
    ...
    public:
       ...
       virtual void Tick(float DeltaTime) override;
       
    ...
    };

     

    FirstPersonCharacter.cpp

    #include "Kismet/GameplayStatics.h"
    
    ...
    
    void AFirstPersonCharacter::Tick(float DeltaTime) {
    	Super::Tick(DeltaTime);
    	
    	FHitResult HitResult;
    	TArray<AActor*> LineTraceIgnoreActors;
    	UKismetSystemLibrary::LineTraceSingle(GetWorld(),
    		FirstPersonCameraComponent->GetComponentLocation(),
    		FirstPersonCameraComponent->GetComponentLocation() + FirstPersonCameraComponent->GetForwardVector() * 1500,
    		ETraceTypeQuery::TraceTypeQuery1, false, LineTraceIgnoreActors, EDrawDebugTrace::Type::ForOneFrame, HitResult, true);
    }

     

    4. 살펴보기

     

    더보기

    위 함수는 Hit Result 구조체와 bool 값을 반환합니다.

    각각 수행한 트레이싱의 결과와 성공 여부입니다.

     

    Hit Reuslt는 다음과 같이 많은 결과값으로 구성되어 있습니다.

    몇 가지를 짚어본다면 충돌 지점의 좌표를 나타내는 Location, 충돌한 액터의 참조를 나타내는 Hit Actor이 있겠습니다.

     

    이번 글에서는 Tick에 해당 함수를 구현했으나, 트레이싱이 필요한 상황에 한번만 호출하는 것으로 정확도를 높히는 등에 사용할 수 있습니다.

     

    만약 트레이싱의 결과만 필요하고 시각적으로는 보이지 않아야 할 필요가 있다면, Draw Debug Type값을 None으로 설정하는 것으로 구현할 수 있습니다.

     


     

    해당 기능은 FPS의 히트스캔과 같은 기능을 구현하는 데에 사용될 수 있습니다.

    또한 1번 문단의 결과로 '레드 닷' 이라는 표현을 사용했으나, 게임에 실제로 적용되기에는 부적합한 이펙트이기 때문에, 결과 값을 이용해서 추가적인 이펙트를 구현하는 데 사용될 수 있겠습니다. (레드 닷 효과, 레이저 장애물 효과 등)

     

    이후에 해당 기능을 이용하는 다른 글로 찾아뵐 수 있도록 하겠습니다.

    감사합니다.

    댓글

Designed by Tistory.