몬스터 헌터 라이즈를 하면서...

강냉쓰·2021년 5월 20일
0

근황로그..

목록 보기
1/4
post-thumbnail

요즘 '몬스터헌터 라이즈'를 아주 즐겁게 하고있어.
하고있으면서 참 많은 생각이 들어.

우리 회사 프로젝트는 간단하게 말하면 1인칭 서바이벌 장르야. 거기서 NPC를 내가 개발했었거든. Behavior Tree 를 처음 써본건 아니지만 상대적으로 경험이 부족하기때문에 삽질을 많이했어. 또한 '몬스터 헌터 라이즈' 를 하면서 '아... 내가 삽질을 했구나...' 라는 부분을 또 느낄 수 있었어.

개발하면서 내가 개발한 NPC와의 차이, 또 부족한점이 보였어. 게임할때는 별로 대수롭지 않게 생각했던 것들이었는데 내가 몬스터헌터 라이즈를 플레이하면서 우리게임에 필요하다고 느낀점은 3가지였어.

첫번째, 대형몬스터의 Yaw 는 항상 캐릭터를 바라보지않아.

내가 만든 NPC중에 대형몬스터가 나오기는 하지만 일단 잡몹부터가 항상 플레이어 캐릭터를 바라보게 만들었어. 'Set Focus' 라는 함수를 사용하면 그때부터 몬스터의 Yaw 값은 Focus Actor 를 항상 향하게 돼. 회전하는 애니메이션은 있었지만 플레이어 캐릭터가 감지되지마자마자 이 함수를 실행해서 그때부터 모든 행동을 할때 항상 캐릭터를 바라보게 짰어.

그래서 플레이어를 감지하면 플레이어를 향해 일직선으로 달려가 공격을 하니 보통 이 부분은 이상하게 보이지 않았지만 문제는 공격 애니메이션을 할때 발생했어. 공격 애니메이션을 하는 중 플레이어들은 당연히 가만히 있지 않겠지. 좌우 무빙을 칠꺼야. 그렇게 되면 공격 애니메이션에는 회전하기위해 발구르는 애니메이션이 없는데 그 상태에서 Yaw 만 미끄러지듯 도는 어색하게 보이는 상황이 연출되는거지.

하지만 몬스터 헌터는 그렇지않아. NPC를 감지하면 먼저 플레이어를 바라보며 포효를 해. 그 포효를 하는동안 플레이어를 계속 바라보지 않지. 또한 각종 공격을 할때마다 플레이어를 향해 계속 Yaw 값이 돌아가지 않아. 한마디로 "Set Focus' 의 On/Off 가 존재한다는 거지. 특정상황에서는 캐릭터를 향해 Yaw 값이 돌아가기도 하고 아니기도 하고 하지.

두번째, 대형몬스터의 목은 항상 캐릭터를 바라보지 않아.

내가 만든 NPC 중 머리가 항상 플레이어를 바라보는것도 있고 아닌것도 있어. 하지만 이 부분도 항상 캐릭터를 바라보니 공격중에서도 계속 바라보게 되는거지. 하지만 몬스터헌터에서는 마찬가지로 특정상황에서 플레이어를 바라보고 또는 바라보지않고, 보통 NPC가 바라보고 있는 각도보다 더 뒤로 가버리면 바라보지 않는데 이 부분은 되어있지만 플레이어를 어느상황에 바라봐야하는지 또한 바라보지 않아야하는지도 추가가 되어야할것같아.

한가지 더 고려해야할 사항은 애니메이션은 지금 서버에서 돌고있지가 않거든. 클라에서만 돌기때문에 Anim Blueprint 에 있는 변수들은 리플리케이션이 안될건데... 아 그리고 이건 테스트해보지 않았지만 아마 Anim Blueprint 자체도 리플리케이션이 안될꺼야. 그래서 되고 안되고를 캐릭터 클래스가 브릿지로 리플리케이트 된 변수를 가지고 있어야 하지 않을까... 하는 생각이 드네...

또한 캐릭터를 바라보고 안바라보고는 사실 서버에서 관리할 문제도 아니니... 그냥 Anim Notify 로 빼는것도 좋은방법같애. 굳이 서버를 거쳐서 리플리케이트 할 필요 없을듯한데...? 어쩌피 target Actor 는 리플리케이트 될꺼니...

세번째, 플레이어가 어디에 있는지에 따라 공격 방식이 결정돼

나는 두개의 Behavior Tree Task를 만들었어. 첫번째는 AI가 공격방식을 먼저 설정해서 공격 가능한 거리만큼 목표로 접근한 다음 목표를 공격하는것과, AI가 목표가 얼마만큼의 거리에 있는지에 따라 공격방식을 설정하고 다가가 공격을 하는것 이렇게 두개.

하지만 몬헌은 좀 달랐어. 여기서 한가지 더 나아가 목표가 자신의 위치로부터 어느 방향에 있는지에 따라 그 방향으로 공격하는 방식을 결정하고 난 다음 그 애니메이션을 재생하는거였어. 캐릭터가 어디에있는지, 또 어느 방향에 있는지도 고려되는거지.

일단 몬헌은 플레이어가 자신으로부터 멀리 있을땐 주로 앞으로 공격을 했고, 아니 생각해보면 뒤로 하는 공격인데 플레이어가 멀리있기때문에 굳이 플에이어 방향쪽으로 공격 유효사거리정도로 움직여서 그곳에서 뒤로돌아서 뒤로 공격을 할 필요는 없잖아...? 어느방향인지 체크하는 공격 같은 경우에는 주로 가까이 있을때 한것같애.

그렇다면

플레이어와 가까이 있는가?
Yes 어느방향에 있는가?
No 뛰어가서 돌진공격

와 같이 판단을 한다는거가 되겠지.
또한

그 방향으로 공격할 수 있는 공격방식이 있는가?
Yes 공격 개시!
No 한바퀴 휘리릭 도는 범위공격 개시!

같은 느낌도 받았어. 특정한 방향 없이 한바퀴 쭈우우욱 도는 애니메이션이나 크게 훑는 애니메이션을 했었어.

물론 전체적인 큰 패턴도 존재해. 이 공격 다음 이 공격이 나온다 같은...? 하지만 그 공격의 시작은 '나로부터 플레이어의 캐릭터가 어디 방향에 있는가?' 야. 그래서 플레이를 하다보면 '몬스터로 부터 이 방향, 이 정도의 거리에 있으니 이 공격을 하겠지?' 같은 생각이 자연스럽게 들고 또한 그 예상은 적중이 되고 그게 경험이 되면 미리 그 공격에 대해 대비할 수 있게 되는거지.

내가 짠 AI가 단순하다고 생각이 되어지는 이유 중 하나가 이거인것같애. 지금 NPC 들은 전부 앞으로 공격하는 스타일만 있거든. 이게 모든방향, 모든방향은 아니지만 특정방향 그리고 그 방향의 공격이 없을 시 시전할 수 있는 범위공격도 존재해야하는데 그게 없다는거... 단순히 앞으로만 공격할 수 있다 보니 플레이어가 AI 하나 잡아놓고 뱅글뱅글 돌면서 뚝배기 깨버리면 속수무책하게 당한다는거지... 이게 고려되야 첫번째도 적용했을 때 어색하지 않게 적용되지 않을까 생각이 들어.

그래서...

물론 1인칭 게임과 3인칭 게임의 AI를 비교해봤자 별로 의미없는 얘기일 수 있지만 또한 일부 얘기는 몬헌은 그만큼 플레이어의 움직임 또한 묵직하기 때문에 대응할 시간이 길게 필요하고, 어느정도 예상할 수 있게 해야하기 때문에 생긴 특징도 있지만 적어도 내가 지적한 3가지의 문제점과 그 대응책은 충분히 내가 짠 AI를 발전시키는데 괜찮은 점들 같아.

일단 이렇게 적으면서 확실하게 할 수 있는게 몇가지 있지만 두번째 문제를 해결하기 위해선 아직 우리 게임에는 없는 애님블루프린트 상속관계 부터 만들어야할듯 하고... 어쩌피 머리가 플레이어를 바라보는 로직은 다른 AI들도 쓰이는 본만 다르지 다 비슷하게 사용될꺼니 그 부분을 상속관계로 구현 가능한지... 알아봐야겠어...

그리고 세번째는... 음... 일단 테스크 만드는거야 별로 어렵지 않지만 문제는 애니메이션이야... 그만큼 필요한 애니메이션이 엄청 많아지는데... 이건 나혼자 고민할 문제는 아니군...

profile
개발하다가 나온 여러가지 고민과 그에 대한 해결책들을 간결하지않고 일기처럼 끄적여봅니다.

0개의 댓글