플밍

언리얼 책 떼기 - AI컨트롤러, 네비게이션 맛보기

에페아 2019. 12. 23. 14:49

티스토리 재밌어보여서 그냥 네이버블로그에서 갈아탔습니다

 

처음 쓰는 글이니까 적는거지만 이동네는 그냥 나중에 제가 보기 편하라고 써놓는 글이에요

남들 이해시키려고 쓰는 글 아님ㅇㅇ

그러니까 이해못해도 전 책임 안질거에요

 

그리고 대충 개념이해만 하면 될정도로만 쓰는거라 저만 알아듣게 쓴 부분이라던가,

실제 정의와 다른 부분도 있을 수 있습니다

잘 모르는 부분일 수도 있고, 대충 야매식으로 쉽고 빠르게 알아먹을 수 있는 걸 목표로 두고있기때문에..

 

------------------------------------------------------

 

언리얼에서 캐릭터가 움직이기 위해선 누군가가 조종기를 연결시켜줘야 합니다. 그래서 유저가 사용할 캐릭터는 유저가 사용하는 조종기인 "PlayerController"라는 걸 꽂아서 사용합니다

 

AI가 캐릭터를 조종할때도 마찬가지로 조종기를 꽂아줘야합니다.

그래서 AI를 위해 있는 조종기가 "AIController" 인 거죠

 

그럼 한번 이걸 갖다가 주기적으로 주변을 배회하는 AI를 만들어보죠

 

일단 시작하기 전에 "프로젝트이름.Build" 파일로 가서

요 부분에 "NavigationSystem" 이랑 "AIModule" 을 추가해줍시다

이거 안하면 안돼요

 

새 C++클래스 생성으로 AIController를 생성합시다

사진과 같이 생성을 하시면 됩니다

생성할 클래스 이름은 알아서 잘 정하시면 되고, 전 책에 있는대로 "ABAIController" 라고 이름을 지었습니다

 

그다음은 헤더랑 cs파일을 보며 설명해보도록 하죠

 

네 주석이 다 설명해주고 있네요

 

OnPossess랑 OnUnPossess 는 각각 조종할 캐릭터한테 연결했을 때, 연결을 끊을 때 실행되는 함수입니다

 

그리고 우리가 만들 "주변을 배회하는 AI"를 만들기 위해 "OnRepeatTimer", "RepeatTimerHandle", "RepeatInterval"

를 각각 사진에 나온대로 선언해줍니다

 

다른건 다 알겠는데 FTimerHandle 요건 정확히 뭔지 잘 모르겠네요

 

이제 cs파일로 넘어갑니다

 

위에서부터 설명을 들어가죠

 

RepeatInterval은 이동 명령을 시킬 주기(초 단위)를 넣어둘 변수입니다

3.0f를 넣었으니 3초에 한번 실행되게끔 만들겠다는 거죠

 

그다음 OnPossess를 보면 SetTimer라는 함수를 사용합니다

요건 알아서 주기적으로 함수를 실행해주는? 그런 건가봐요

SetTimer로 타이머에 할일을 넣어주면 이제 시간이 될 때 마다 계속해서 실행이 되는거죠

 

인자는 (타이머핸들, 누가 실행할지, 어떤 함수를 실행할지, 실행 주기(아까 3.0f를 넣어둔 RepeatInterval 를 여기다가 사용합니다), 실행하자마자 한번 바로 실행할지 말지, 몇초간 실행시킬지(얘는 생략하면 안멈춥니다))

설명으로 적으니까 좀 기네요 근데 실상 써보면 위에 사진처럼 한줄이에요

네. 한줄이요

 

그다음 OnUnPossess에서는 이제 연결을 끊었으니까 현재 조종하던 캐릭터의 타이머(주기적으로 실행하게 하는거)를 꺼줍니다

ClearTimer 로 실행할 일 에서 빼줄 수 있습니다

인자는 SetTimer에서 넣었던 타이머핸들을 그대로 넣으면 됨니다

 

그리고 주기적으로 실행할 함수였던 "OnRepeatTimer"

 

여기선 이제 주변 랜덤한 좌표를 찍고 거기로 가라는 명령을 내리는 일을 합니다

 

랜덤한 위치라고는 했지만 그래도 이동 가능한 공간이 있고 이동 불가능한 공간이 있지 않겠습니까

만약에 벽 뒤 막힌곳이 랜덤좌표로 찍혀버리면 이동을 못하겠죠

그래서 이제 그걸 방지하기 위해 UNavigationSystemV1을 사용합니다 요걸 사용하면 이동 가능한 위치 내 랜덤 좌표를 찍을 수 있습니다

 

자 그럼 일단 움직일 수 있는 영역을 지정해줘야겠죠

 

이런식으로 월드에 내비 메시 바운드 볼륨을 깔아줍니다

그럼 네모 박스가 나오게 되는데 그 박스 영역 내에서 움직일 수 있는 영역을 자동으로 만들어줍니다

요런식으로요(저 초록색 영역은 p를 누르면 나옵니다 이동 가능한 영역을 표시하는 거죠)

그럼 이제 영역을 지정해줬으니 저 영역 내에서 좌표를 찍어야겠죠

 

GetRandomPointInNavigableRadius(중심점, 랜덤으로 뽑을 범위, 좌표를 담을 변수)

이 함수를 쓰면 알아서 랜덤 좌표를 뽑아서 변수에 넣어줍니다

좌표를 잘 뽑아냈으면 true를 반환하고, 그렇지않으면 false를 반환하죠

 

이제 잘 뽑아냈으면 그쪽으로 가라는 명령을 해야겠죠

그 부분은 SimpleMoveToLocation(누가 움직이게 시킬건지, 이동할 좌표)

이걸로 명령을 내립니다

 

그럼 이제 움직이죠

 

 

 

반응형

'플밍' 카테고리의 다른 글

리듬겜 프로토 제작일기 - 5  (0) 2020.08.21
리듬겜 프로토 제작일기 - 4  (0) 2020.08.19
리듬겜 프로토 제작일기 - 3  (0) 2020.08.18
리듬겜 프로토 제작일기 - 2  (0) 2020.08.17
리듬겜 프로토 제작일기 - 1  (0) 2020.08.16