본문 바로가기
UE5 : Paper 2D (Blueprint)/게임 컨텐츠

[UE5 : Paper2D(BP) - 게임 컨텐츠] Chapter 03. 몬스터 AI

by song.ift 2024. 1. 16.

GitHub : https://github.com/developeSHG/UE5-Paper2D/commit/4077e879c90e9f626c2ee4dac1ba9ce5660d7939

 

몬스터 AI · developeSHG/UE5-Paper2D@4077e87

hokyung.song committed Jan 24, 2024

github.com

 

 

 


 

 

현재 몬스터들이 플레이어를 안따라가고 멍하니 있는 이유는, 몬스터 클래스의 Pawn을 보면 Auto Process AI가 Placed in World로 되어있다.

이 속성은 월드에 사용자가 툴을 이용해서 드래그앤드롭으로 배치한 애들만 AI에 의해 컨트롤이 된다.

이것을 맨 마지막 옵션이 Spawned으로 변경하면, 배치한 것 뿐만 아니라 코드로 스폰한 몬스터도 인공지능 즉 사용자가 만든 AI Controller에 의해 빙의를 하게 만들 수 있다.

 

하지만, 실제로 컴파일하고 실행해보면 변화가 일어나지 않고 아래와 같이 에러가 난다.

Update AI라는 함수에서 몬스터 클래스에 접근을 실패했다 라는 그런 에러인데, C++ 기준으로는 Null Crash가 생겼다는 얘기다.

실제로 Update AI에서 처음 시작할 때, My Monster라는 객체가 validation에서 실패했기 때문에 크래쉬가 났다.

 

AI 컨트롤러에서 Event BeginPlay안에 Get Control Pawn을 이용해서 My Monster에 세팅하는 부분을 넣어놨다.

기존에 툴로 드래그드롭해서 배치한 경우는 아무런 문제가 없었지만, 그게 아닌 경우는 아직까지 AI 컨트롤러가 붙지 않아서 현재 조작하고 있는 폰을 찾으려고 한 경우는 실패했다고 볼 수 있다.

 

그래서 BeginPlay가 아니라 AI 컨트롤러가 어떤 특정 몬스터에 빙의하는 수간에 해당하는 이벤트가 있을 것이다. 대략적으로 Pocess라는 이름으로 되어있을 것이다. 그 이벤트로 바꿔준다. 그럼 Get Control Pawn을 사용할 필요가 없다.

 

이제 움직이고 있지만, 살짝 어색한 부분이 있다. 이전에는 하드코딩으로 거리를 재서 공격하게 만들었기 때문에 엉뚱한 위치에서도 타격을 하고 있다. 그래서 플레이어가 앞에 있을 때, 스킬 차거리가 1이라고 가정하고 타격하는 식으로 수정해야한다.

 

 

몬스터 AI를 기존 플레이어를 타겟으로 Direction을 따라 이동했다면, 타일 한 칸 단위로 이동하도록 수정.

 

목표 대상까지 걸어가야 되는 타일 개수는 몇개인지 구하는 함수.

 

이제 AI Controller에서 Target 위치에 도착하면, 위에 만들어준 Get Tile Count to Target 함수를 통해 타일 거리가 1인지 체크한 후, 타격한다.

 

하지만, 실행해보면 몬스터는 엉뚱한 방향을 바라보고 있다. 이건 이전에 몬스터는 타겟을 향해 Direction을 설정해 일직선으로 따라가는 부분을 삭제했으니, 다시 Direction을 설정하는 부분을 만들어야한다.

 

타겟과의 거리를 구해주고, x끼리 차이와 y끼리 차이를 비교해, 한 방향이 더 컸다라고 하면 그에 맞는 좌우 or 상하 이동을 먼저 하도록 한다.

만약 5축으로 굉장히 멀리 덜어져있으면 위로 가는것보다 좌로 따라가는 걸 먼저 우선순위를 높여야 할수도 있기 떄문이다.

 

 

Update AI에서 실시간으로 AI를 계속 연산해주는 루틴이었는데 바라보는 방향을 계속 유지할 순 없다. 왜냐면 플레이어의 좌표도 실시간으로 계속 바뀌기 때문에 그것을 주기적으로 체크해서 그 방향으로 바라보게끔 이제 유도를 해줘야 한다.

위처럼, 만들어준 Look At Target 기능을 추가한다. 즉 플레이어를 향해서 고개를 돌려서 바라보게 만드는 개념.

그러면 사실 방향만 바라보는 것 뿐만 아니라, 세팅해준 Direction에 따라서 이동 방향도 실제로 결정이 되는 식으로 맞물려 있기 때문에 가능하다. 

 

댓글