프로그래밍/Unreal 부트캠프

TIL 2025.02.19 기록

Rozentea 2025. 2. 19. 23:26

0. 개요


오늘은 드론을 마무리하고, AI 수업에 관해 조금 정리하고, 드론 AI를 어떻게 구현할지에 대해 고민하고, 조사하는데에 시간을 많이 쏟은것 같다.

 

또, 중간에 깃 허브 이슈가 또 발생해서 생각보다 어제보다 작업을 많이 진행하지 못해서 아쉬움이 남았다.

 

1. AI 수업 정리


AI가 스스로 길을 찾고 움직이는 모습은 NavMesh라는 경로 탐색 시스템과 AIController를 이용해 만들어진 것이다.

 

- 경로 탐색 (Pathfinding)

목표 지점까지 이동 경로를 계산하는 알고리즘 혹은 기법 주로 AI가 장애물을 피해 효율적인 경로를 찾을 때 사용

 

- NavMesh

게임 월드에서 이동할 수 있는 영역을 메쉬 형태로 표현한 것 AI가 해당 NavMesh 위에서 경로 탐색을 수행

 

- AIController

게임 속 AI를 제어하는 주체로, Pawn이나 Character와 상호 작용하며 행동을 결정 AI의 의사결정 로직을 담고, Behavior Tree나 Perception등을 관리한다.

 

언리얼 엔진에는 이런 NavMesh를 제공해주고 있어서 쉽게 AI를 만들 수 있다.

즉, 복잡한 경로 탐색 알고리즘을 직접 적용하지 않아도 된다.

 

< NavMesh 만들기 >

NavMesh는 볼륨에서 내비메시 바운드 볼륨이라고 있다.

p를 누르면, AI가 이동할 수 있는 공간이 초록색으로 뜨게 된다.

반대로 빨간색의 영역은 이동하지 못하는 영역이다.

 

이렇게하면 NavMesh 설정은 모두 마쳤고, 이번에는 순찰 시스템을 만들기 위해서 순찰 포인트를 둘 것이다.

 

< 순찰 포인트 만들기 >

 

2. 팀 프로젝트


1. Tilt 적용

MaxTiltAngle : 최대 틸트 각도

InterpSpeed : 선형 보간 속도

변수를 추가해주었다.

해당 변수들은 에디터에서 수정이 가능하도록 오픈해주었다.

void ADrone::TiltDrone(float DeltaTime)
{
	float TargetRoll = MoveInput.Y * MaxTiltAngle;
	float TargetPitch = -MoveInput.X * MaxTiltAngle;
	
	if (FMath::IsNearlyZero(MoveInput.Size()))
	{
		TargetRoll = 0.0f;
		TargetPitch = 0.0f;
	}
	
	const FRotator CurrentRotation = TiltSceneComp->GetRelativeRotation();
	
	InterpSpeed = 1.0f;
	const float NewRoll = FMath::FInterpTo(CurrentRotation.Roll, TargetRoll, DeltaTime, InterpSpeed);
	const float NewPitch = FMath::FInterpTo(CurrentRotation.Pitch, TargetPitch, DeltaTime, InterpSpeed);

	TiltSceneComp->SetRelativeRotation(FRotator(NewPitch, CurrentRotation.Yaw, NewRoll));
}

또, 이전 과제에서 틸트를 적용할 땐 코드를 정리하지 않아서 괜히 복잡해 보였는데, 이번에는 깔끔하게 정리해두었다.

 

또 컴포넌트 구조는 다음과 같이 수정해주었다.

CapslueComp

     ㄴ> CameraSceneComp

          ㄴ> SpringArmComp

               ㄴ> CameraComp

          ㄴ> TiltSceneComp

               ㄴ>SkeletalMeshComp

굳이 TiltSceneComp를 추가해준 이유는 아래와 같다.. ㅠ

TiltScene으로 한번 더 구분하지 않는다면, 틸트 회전 때문에 바뀐 ForwardVector로 이동하기 때문에 점점 아래로 향하게 가도록 움직이기 때문이다..

따라서 TiltSceneComp를 추가적으로 달아 기존 피벗 위치 때문에 회전을 시킬 수 없었던 SkeletalMesh도 커버가 되고, Mesh만 움직이게도 할 수 있기 때문에 이런 구조로 잡아 작업했다.

 

2. 최종 드론 움직임 완성 영상

이전보다 코드가 더 깔끔하고, 움직임도 마음에 들게 나왔다.

 

3. 드론 AI 개요

우선.. 플레이어를 따라다니는 AI를 만들고, 이후에 움직임을 더 자연스럽게 만들고, 몇몇 상태를 만들어 동일한 상태더라도 중간중간 애니메이션 처럼 행동하도록 해주는게 목표이다.

(애니메이션처럼 이라는 부분은 음.. 부드러운 움직임에 뭔가 감정이 들어간듯한 움직임?)

 

음.. 우선 드론 AI를 만들기 위해서 AI 수업을 들으며 다시 한번 정리를 했었다.

하지만, NavMesh는 하늘에 떠다니는 드론 같은게 아니라 땅을 기반으로 움직이는 것들에 최적화되어 있는 느낌이었다.

 

조금 조사해보니, Offset을 주어서 하는 경우가 있던데, 아무래도 바닥을 기준으로 다니다보니 부자연스러운 부분이 많아 보였다.

때문에 수업은 천천히 정리하고, 다른 방법들을 조사해 AI를 구현해 봐야겠다고 생각했다..

(물론 내가 원하는 느낌을 살리기 위해서는 Behavior Tree를 사용해야할 것 같아서 해당 부분은 반드시 다시 정리하고 공부해야할 것 같았다.)

 

4. 관련 튜토리얼 찾아보기

 

문제는 너무 단순한 AI 수준이라서.. 내가 원하는 그런 다양하고 복잡한 기능들을 만들기엔 충분하지 않아보였다.

때문에 더 찾아보고, 계속해서 고민하고 시도해보는 수 밖에 없다고 생각했다.

 

3. 마무리