본문 바로가기

Unreal Engine 5

언리얼에서의 안전한 정규화(단위벡터 사용법)

//1번 코드

 FVector Velocity = GetVelocity();
 Velocity.Normalize(0.0001);

  FVector ActorLocation = GetActorLocation();
  FVector TargetLocation = ActorLocation + Velocity * distance;

  DodgeToLocation(TargetLocation);

 

두가지의 코드를 비교해 보자 

 

//2번 코드

  // 현재 속도 가져오기
  FVector Velocity = GetVelocity();

  // 속도가 0이 아닐 경우 방향을 정규화
  FVector DodgeDirection = Velocity.GetSafeNormal();

  if (!DodgeDirection.IsNearlyZero()) // 방향이 0이 아니면
  {
      // 거리만큼 벡터 곱하기
      FVector DodgeTargetLocation = GetActorLocation() + (DodgeDirection * distance);

      // Dodge 실행
      DodgeToLocation(DodgeTargetLocation);
  }

 

 

텔레포트를 쓸때 내가 쓰는 코드인데, 둘다 똑같은 코드라는 것을 알 수 있다.

 

하지만 어느 것이 더 안전한가? 바로 2번 코드이다. (값이 0에 수렴하는 값이 있을경우의 이야기이다.)

 

상황에 따라 안전한 경우가 다르겠지만 위 코드는 이동중에 dash 키를 눌렀고, 그 방향벡터에 따라서 일정 거리만큼 teleport를 하는 코드인데 

 

왜 2번 코드가 더 안전한지 생각해보자

 

 

 

 

 

 

< 나의 답변 >

 

  • GetSafeNormal()은 벡터의 길이가 0일 경우 자동으로 (0,0,0) 반환하여 예외 처리 불필요.
  • Normalize()는 벡터의 크기가 0일 때 변경되지 않으며 경고가 발생할 수 있음.
  • GetSafeNormal()은 실제 방향 벡터를 반환하므로 안정적인 결과 보장.