< [Paper2D로 게임 만들기 필기] 7-8. 타일 관련 작업, 몬스터 스폰 / AI 개선

언리얼엔진5/블루프린트 Paper2D 로 게임 만들기

[Paper2D로 게임 만들기 필기] 7-8. 타일 관련 작업, 몬스터 스폰 / AI 개선

Rocketbabydolls 2023. 7. 28. 16:11

7일차부터는 지금까지 짠 로직을 타일 기준으로 수정하는 작업을 했다. 

 

 

함수 Pure 옵션

 

공식 문서의 Pure 옵션에 대한 설명

   쉽게 말해서 함수의 옵션 중 
Pure : 상태를 변경하지 않는 함수. 반환값만 돌려주거나 한다. ex) 플레이어의 위치는? -> (4, 5) 

Impure : 자유롭게 상태를 변경하는 함수.

Pure 옵션

 

Pure 옵션 설정 전 (파란색)
Pure 함수 설정 후 (초록색)

   Get 함수 같은 경우는 디버깅의 간편성을 위해 Pure 로 설정해주는 것이 좋아 보인다. ( 코드에 변형을 가하냐 하지 않느냐를 다른 팀원도 간편하게 볼 수 있음)

 

 

벡터 연산을 통해 방향을 구해 준뒤 Direction 에 넣어줬다.

위의 작업을 통해 타일을 한 칸씩 이동할 수 있다. 

키 입력이 없으면 -> Stop Move

 

HasArriedtoDest 함수

   위의 함수는 목적지에 도착했는지 확인하는 함수인데, 벡터의 길이가 10 이하면 도착했다고 판별한다. 여기서 10은 임의로 정한 벡터 길이이다.(추후 수정 예정) 

 

UpdateDestination

   Stop Move 가 아니면, 다음 목적지를 계산해서 Destination 변수에 적용해준다. 

 

 

버그 수정

   이제 랜덤하게 몬스터와 플레이어를 스폰 시켜서 싸움을 붙일건데, 단순하게 SpawnActor 함수를 통해 스폰을 시키면 몬스터의 AI 가 작동하지 않는다. 

 

스폰만 되고 가만히만 있는 몬스터

 

   그럴땐 AIController 에서 BeginPlay 로 몬스터를 세팅하는 대신에 Event On Possess 를 사용하면 된다. (빙의하는 순간에 실행)

 

 

 

   우리가 이전에는 객체에 Collision Box를 만들어서 3D 기반으로 처리를 했다. 공격을 하면 객체가 바라보는 방향의 일정 영역인 collision box 안에 들어온다 하면 몬스터에게 데미지를 주는 식으로 했는데, 우리가 타일 맵을 만들고 Map 모든 여역에 대한 불리언 배열도 만든 이 시점, 그렇게 계산할 필요가 없다.

   단순히 플레이어가 공격 -> 어느 방향인지 확인 -> 맵이 점유가 되어 있는지 확인 -> 점유되어 있는 것이 몬스터이다 -> OnDamaged 호출     이렇게 하면 훨씬 편하다는 걸 알 수 있다. 완전히 2D 지향으로 바꾸는 것. 

 

 

Creature 의 충돌을 NoCollision으로 변경

   이후 맵의 정보를 이용해 2D 지향으로 바꾸어 준다.

 

Tilemap 에 배치한 Creatures 중에 내가 입력한 좌표에 존재하는 Creature 가 없다면
Can go. 갈수있다.

 

 

   근데 여기까지 실행하면 몬스터가 내 위치를 잘 따라오지 못한다. 이는 처음에 플레이어 위치를 확인한 뒤 이동을 계속 하는데, 그 사이에 나는 이동을 또 해서 목적지가 바뀜을 갱신해주지 못했기 때문이다.

   따라서 이렇게 

LookAtTarget 함수

   LookAtTarget 함수를 만들어주고, x, y (실제로는 x,z) 방향 중에 더 이동 거리가 긴 부분을 먼저 이동시켜주면 된다.

그러면 AIController 에서 틱마다 타켓을 쳐다보고 이동 거리를 구한 뒤, 이동을 하거나 공격하게 만들 수 있다.

 

UpdateDestination(Creatures) 에서 오버라이딩 해서 (Monster) 목적지 갱신 전에 타켓을 먼저 보게 만든다.

 

 

작동 화면

 

 

   이제 플레이어는 잘 따라와서 공격하지만, 구현의 한계로 몬스터가 서로 겹치면 다른 몬스터가 돌아서 오지 않고, 벽에 걸리면 여느 게임의 버그처럼 움직이지 못하는 장면도 볼 수 있다. 이는 길찾기 알고리즘을 AI 에게 넣어줘야 하는데, 아직은 고난이도이기 때문에 놔두도록 한다.