[UE5] 타겟을 추적하는 눈동자 만들기

재석 블로그·2025년 4월 23일
0

FoodRumble 개발일지

목록 보기
3/3

그렇게 거창하진 않지만 이번에 만든 보스 캐릭터의 특징 중 하나는 눈이 공격대상(=플레이어)를 항상 주시한다는 것이다.

공포 영화에서 주로 볼 수 있는 그 연출이다.

과거 초상화 기법처럼 어느 방향에서 봐도 착시로 나를 보는 것처럼 보이는 그런 것이 아니고 실제로 플레이어의 위치를 트래킹하여 회전한다.

여기에 사용되는 핵심 함수는 FindLookAtRotation()이다.




안구 준비하기

  • 포스티 맨 위의 GIF와 다르게 보스의 스켈레탈 메시는 위처럼 눈이 없다. 만들 때부터(다음 혹은 다다음 포스팅에 다룰 예정) 눈알을 따로 달 것을 가정하고 눈을 비워놓고 만들었다.

  • 안구 액터인 BP_Boss_Iris를 만들기 위해 필요한 것은 4가지. 액터 클래스 하나, 흰자 머티리얼, 홍채 머티리얼, 동공 머티리얼이다.

머티리얼 만들기

  • 머티리얼 만들기의 난이도는 정말 낮다. 컨텐츠 브라우저에서 머티리얼을 하나 만들고, 적절한 BaseColor를 설정하고 Specular, Roughness를 적절히 조절해서 번들번들한 느낌을 내주면 된다.

안구 액터 만들기

  • 눈알 액터는 위처럼 3개의 스태틱 메시로 이루어져 있다.
  • 흰자홍채Sphere 스태틱 메시, 동공Cylinder를 스케일 조절하여 사용하였다.
  • 회전이 [0, 0, 0] 인지 잘 확인하고(FindLookAtRotation()을 위해) 잘 겹쳐서 액터를 완성해주면 눈알은 이것으로 완료.


보스 본체에 안구 부착

  • 안구가 2개이므로 Child Actor 컴포넌트를 2개 추가한다.
  • 해당 컴포넌트는 스켈레탈 메시에 부착한다. 이 프로젝트에선 보스의 본체가 움직이지 않으므로 상관은 없지만 혹시라도 애니메이션이 있어서 움직일 경우 스켈레탈 메시에 부착하지 않으면 애니메이션의 움직임과 따로 놀게 된다.

  • Child Actor Class에 위에서 만들었던 안구 액터를 할당하고 위치를 잘 잡아주면 된다.


플레이어를 주시하게 만들기

  • 위에서 열심히 준비했으니 이제 적용할 차례. 본체의 TickFunction()에는 LeftEyeFocusOnTarget()RightEyeFocusOnTarget() 노드가 걸려있어 매 프레임 호출되는데, 이를 통해 플레이어 방향으로 계속 안구 액터가 회전하게 된다.

  • 가장 먼저 공격 대상(=플레이어) 정보를 Hands에서 받아온다.
  • TArray<BP_Boss> Hands는 게임 시작시 캐싱한 보스의 손 객체들을 담고 있다.
  • 손은 저마다 공격 대상인 Target을 가지고 있는데, 본체는 이걸 가져와서 주시 대상으로 삼는 것이다.

  • FindLookAtRotation() 함수에 안구의 위치벡터와 플레이어의 위치벡터를 전달하면 안구에서 플레이어 방향으로의 회전값을 구할 수 있다.
KISMET_MATH_FORCEINLINE
FRotator UKismetMathLibrary::FindLookAtRotation(const FVector& Start, const FVector& Target)
{
	return MakeRotFromX(Target - Start);
}
  • 위 내부 코드를 보면 알 수 있듯 이 회전값은 X축 기준 회전값이다. 위에서 안구 액터의 회전값을 [0, 0, 0]으로 한 이유가 이것이다.
  • Clamp 노드로 PitchYaw가 자연스러운 안구 움직임을 보이도록 제한한다.
  • RInterpTo()로 안구의 현재 회전값에서 위의 회전값으로 보간하고, 그 값을 SetActorRotation()에 전달해 안구의 현재 회전을 변경하면 아래와 같이 플레이어를 주시하도록 할 수 있다.

profile
게임 개발자 재석의 블로그입니다.

0개의 댓글