본문 바로가기
프로그래밍/Unreal 부트캠프

TIL 2025.02.20 기록

by Rozentea 2025. 2. 20.

0. 개요


오늘은 계속 드론 AI를 만들었다. 문제는 음.. 잘 따라오는 것 까지는 만들었지만, 장애물에 가로막히면 길을 잘 찾지 못한다.. 이를 어떻게 해결 해야할지 고민하면서 여러 시도를 해보았지만.. 좀 처럼 해결이 되지 않았다... ㅠ

그래서 우선 따라오는 것에 대한 정리만하고, 계속해서 시도해보러 가야겠다.

 

1. 드론 AI 만들기


< 단순 이동 적용하기 >

SinglePlayer 게임이기 때문에 GetWorld()로 부터 0번 인덱스의 플레이어 폰을 가져와 목표 이동 위치를 잡고, 해당 방향으로 선형 보간을 이용해 이동해주도록 했다.

문제는 이동을 할 때, Drone을 조종할 때 만들어 두었던, Move함수에서 이동 방향을 입력받아 해당 방향으로 오브젝트를 이동시키고, Tick함수에서 Tilt를 적용해주고 있었다.

하지만 지금은 AI컨트롤러에서 이동시켜주기 때문에 Drone의 MoveInputValue이 변하지 않아 Tilt가 적용되지 않고 있다.

뿐만 아니라 Drone의 회전은 마우스 입력값에 따라 해주고 있기 때문에.. 회전도 제대로 적용되지 않는다.

 

하지만 지금은 AI컨트롤러에서 이동시켜주기 때문에 Drone의 MoveInputValue이 변하지 않아 Tilt가 적용되지 않고 있다.

뿐만 아니라 Drone의 회전은 마우스 입력값에 따라 해주고 있기 때문에.. 회전도 제대로 적용되지 않는다.

 

< 기존 드론 Tilt를 적용하기 >

작업 중간중간 영상을 찍어 뒀어야 했는데.. 안찍어뒀다.. ㅠ 안댸애애..

Drone에 MoveInput을 전달 받을 수 있는 Set함수를 만들고, AI 컨트롤러에서 구한 목표 지점까지 이동하기 위해 이번 Tick에 가할 힘의 방향을 전달해준다.

이러면 Drone은 이번 Tick에 어느 방향으로 이동하는지를 알게되어 Tilt가 적용될 수 있게 된다..! (와! 코드의 재사용!)

 

< 회전 적용하기 >

void ADroneAIController::DroneRotation(const TObjectPtr<APawn>& PlayerPawnPtr)
{
	const TObjectPtr<ADrone> ControlledDrone = Cast<ADrone>(GetPawn());
	if (!ControlledDrone) return;
	
	ControlledDrone->GetCameraSceneComponent()->SetRelativeRotation(PlayerPawnPtr->GetActorRotation());
}

회전은 단순히 플레이어가 바라보는 방향으로 회전해주도록 만들었다.

 

< 회전 문제 해결 >

빨간색 구가 목표 지점인데, 드론이 최종 이동을 마쳤을 때, 해당 지점에 정확히 오지 않는 문제가 생겼다..

심지어

플레이어가 회전하면, 목표지점은 플레이어를 기준으로 공전하도록 구현해뒀는데, 드론이 꼼짝도 안하는 문제가 발생했다.. (목표 지점은 잘 이동하는데 말이다..)

계속 찾아보고, 실험해보니.. 이전에 드론 조종 때문에 구현해두었던 공기 마찰 때문이었다.

아무래도 힘으로 컨트롤하고 있는데, 제대로 구현을 못한건지.. 아니면 추가적인 작업이 필요한게 정석인건지는 정확히 모르겠다..

아무튼 드론을 AI가 컨트롤 할 때만 공기 저항을 0으로 바꾸는건 좀 이상한 것 같아서.

공기 저항은 그대로두고, PID 수치만 조금 수정해주었다.

사실 계속해 실험하면서 최대한 자연스럽게 나오도록 수치를 맞췄다.

 

이렇게 작업하다보니.. 결국 수치하나가 틀어지면, 자연스러운 움직임이 모두 사라져 버린다.

때문에 수식을 이용해 수식을 고정시켜두면, 값이 하나가 바뀌어도 나머지를 다 그에 맞춰 동일한 결과가 나오도록 정해준다거나 할 수 있을 것 같은데.. 수학 실력이 그리 뛰어나지 못해 직접 계속 실험하면서 조정해야하는게.. 너무 아쉬웠다.

 

< 중간 완성 영상 >

결국에는 플레이어가 회전하면 그에 맞게 드론의 포지션이 설정되고, 플레이어가 움직이면 플레이어를 따라 드론이 날아오는 기능이 자연스럽게 나왔다.

추가적으로 고민해보았을 때,

DroneAI에 비헤이비어 트리를 적용했을 때, 플레이어를 따라오는 로직을 수행할 때는 회전을 단순히 플레이어가 바라보는 방향으로 할게 아니라.

드론이 플레이어를 바라보며 따라오고, 이후에 다시 Idle 상태로 전환될 경우 드론은 플레이어가 바라보는 방향을 바라보도록 만드는게 더욱더 자연스러워보일 것 같다.

 

< 드론이 조금 더 부드럽게, 자연스럽게 움직이도록 다시 수정 >

이동 타겟 거리에 따른 속도 조절과 카메라 충돌을 무시로 변경, 오차 범위에 들어오게되면 이동을 더 제한해주도록 변경

그 결과 이전보다 더 자연스러운 움직임이 나오고, 원하는 타겟 위치에서 이전보다도 더 크게 벗어나지 않는다.

또, 이동 속도를 거리에 따라 조절하게 변경해 드론의 움직임이 더 자연스럽게 나온다.

 

< 장애물 회피 구현 방법 생각하>

  1. LineTrace를 이용해 피하기
  2. 스플라인을 만들어 스플라인을 따라 피하기
  3. 복셀 네비 메시 만들기
  4. 플러그인 사용하기..

계속해서 테스트를 진행하고 있는데, 생각처럼 쉽게 구현되지 않아 문제다..

플러그인은.. 최대한 사용하지 않으려 했는데, 이렇게되면 플러그인을 사용하는게 답인것 같기도하다..

아니 끝까지 해야지..

 

계속 시도중인것은 LineTrace를 이용한 방법을 시도하고 있다.

음.. 꽤 괜찮게 나오긴하는데, 아쉬운 점이 많아서 계속 수정중이다.

 

또, 팀원들과 이야기하다가 좋은 아이디어를 얻었는데,

매우매우 좋은아이디어!!! 드론이 플레이어랑 멀리있는데, 정지상태다? 그러면 워프를 해주는데, 시야 위에서 아래로오도록 오..! 대박대박

이러한 아이디어이다.

 

iiblueblue 님의 블로그

iiblueblue 님의 블로그 입니다.

iiblueblue.tistory.com

좋은 아이디어 주셔서 감사합니다.. (꾸벅)

 

< 장애물 회피 진행 상황 >

음.. 나름 괜찮게 오긴하지만, 길을 찾아서 온다기보다는 목표 지점까지 직선으로 이동하고 약간 우회해서 오는 느낌이 강하다..

NavMesh를 사용해 길 찾기를 하고싶었지만.. 공중을 돌아다니는 AI는 별도로 커스텀해 사용해야하는 것 같아서.. 시도를 못해보았다.

 

지금 또 생각중인 것은 충돌이 발생할 때, 드론을 기준으로 특정 영역만큼 3차원 공간을 분할해, 길찾기 알고리즘을 사용해 길을 탐색하게하면 어떨까 하는 방법도 생각중이다.

 

다만 이러면 Tick당 하는 일이 너무 많아져 퍼포먼스가 떨어지지 않을까 걱정이다..

음.. 아니면 처음 레벨을 시작할때, 레벨 전체를 공간 분할을 한다던지..

이건 더 고민해봐야겠다.

 

2. 마무리


이제 다시 어서 작업하러 가야겠다.

어떻게든 오늘 장애물 회피까지 만들어야.. 내일부터 BT작업에 들어가서 주말동안 드론 AI를 완성할 수 있을 것 같다.

아쟈뵤.. 화이팅!

 

10조 화이팅!!

'프로그래밍 > Unreal 부트캠프' 카테고리의 다른 글

TIL 2025.02.24 기록  (0) 2025.02.24
TIL 2025.02.21 기록  (0) 2025.02.21
TIL 2025.02.19 기록  (2) 2025.02.19
TIL 2025.02.18 기록  (0) 2025.02.18
TIL 2025.02.17 기록  (0) 2025.02.17