[NDC2016] 듀랑고에서 본능과 욕구에 따라 활동하는 동물 AI 구현하기

게임뉴스 | 이동연 기자 | 댓글: 20개 |



대학교 3학년 때, 전공 필수 과목인 인공지능 프로그래밍 강의를 수강한 적이 있다. 졸업하기 위해서는 꼭 들어야 하는 강의였는데 첫 번째 강의에서 교수님이 해주신 말이 아직도 기억이 난다. "프로그래머가 될 거라면 인공지능 전문 프로그래머를 목표로 하는 것도 좋다. 인류의 모든 일을 다 로봇이 하게 되더라도 결국 최후에 남는 직종 중 하나는 로봇의 행동을 설계하는 인공지능 프로그래머일 가능성이 크다."

지금 생각해 보면 참 공감되는 말이다. 이미 인공지능 알파고는 천재 바둑기사 이세돌을 상대로 승리했고, 증권가에서는 애널리스트 대신 인공지능인 '로보어드바이저'로 대체하는 움직임이 일고 있다. 서서히 인간이 담당하는 업무들을 인공지능이 대신하고 있는 것이다.

교수님의 그 말씀을 듣고 한때는 게임 인공지능 프로그래머를 꿈꿨던 적도 있었으나 현실은 강의시간에 공부한 길 찾기 알고리즘의 일종인 'A스타 알고리즘'도 구현하는데 쩔쩔매서 포기해버렸다. 꿈과 현실의 벽은 높았기에.

인공지능이 요즘 사회에서 화제가 된 탓일까, 이번 NDC 2016에서도 게임 인공지능에 대한 강연이 열렸다. 강연의 주제는 게임속 동물의 AI. '야생의 땅: 듀랑고' 속의 동물은 조금 특별하다. 목이 마르면 목마르다는 표현을 하고, 주위에 모닥불이 있을 경우 뜨겁다는 표현과 함께 모닥불 주위를 벗어난다.

이렇게 자신의 욕구에 따라 생동감 있게 행동하는 것. 이런 행동을 구현하려면 어떻게 해야 할까? 넥슨 왓스튜디오에서 서버 로직 프로그래밍을 담당하는 박동일 프로그래머가 말하는 동물 AI를 구현하기 위한 노력과 그 과정에서 맞닥뜨린 제약, 이를 해결하는 과정을 들어보도록 하자.



▲ 넥슨 왓스튜디오 박동일 프로그래머




■ 자연 속 동물처럼 행동하는 듀랑고 속 동물 AI

자연 생태계의 동물들의 저마다 환경에 적응해서 각자의 전략으로 무리를 짓거나 하는 방식으로 생존하듯, 듀랑고속 살아가는 동물들도 플레이어가 단순히 정복하는 난관이나 보상이 아니라 본능과 욕구에 따라 활동하고 상호 작용도 하는 자연의 모습으로 묘사하려고 했다.

이를 위해서 우리는 프로젝트 초기부터 동물 시뮬레이션에 많은 공을 들였다. 초식동물은 욕구에 따라 물을 마시고, 육식 동물은 초식 동물을 잡아먹게 했다. 먹고 먹히는 먹이 사슬을 통해 자연계의 순환고리를 확인해보려고 했으나 식물의 번식을 고려하지 못했고, 육식 동물을 너무 적게 투입한 탓에 초식동물의 번식력을 억제하지 못했다. 결국, 초식동물에 의해 그 섬은 사막화가 되어버렸다.



▲ 초기에는 시뮬레이션으로 동물의 행동을 파악했다.

시뮬레이션만으로는 환경 요인을 확인하기가 어려워서 거시플레이 프로토타입을 만들어서 생태계에 변화를 다양한 요인을 적용하고 그 환경을 관찰했다. 그랬더니 생태계가 안정, 정글화, 사막화되는 여러 현상을 목격했다. 그래서 내린 결론은 동물 AI가 정합성 있는 반응을 해줄 때 생동감 넘치는 경험을 준다는 것이었다.




그럼 이런 거친 환경에서 살아남는 동물 AI를 만들려면 어떻게 해야 할까?

동물 AI의 프로토타입은 에이전트 기반 FSM(Finite State Machine)으로 만들어졌다. 일상적인 상태에서는 로밍하다가 적이 보이면 도망가고, 배고프면 음식을 먹는 방식으로 인공지능의 상태를 정의했으나 많은 동물 객체마다 시야 처리를 해야 해서 시뮬레이션 비용이 높아지는 점과 분산 서버 간 과도한 상호작용으로 말미암은 문제도 있었다.

FSM은 확장성에 대한 제한도 있었다. 듀랑고의 동물들은 다양하다. 이것들을 유한 상태 기계에 모두 구현하려면 엄청나게 복잡해지는 문제가 발생했고 객체 간의 관계도를 파악하기가 매우 어려웠다.



▲ 초기에는 AI의 기초인 'FSM'으로 동물 AI를 만들었다.



▲ 하지만 객체가 많아지면서 확장성에 대한 문제가 발생했다.


■ 분산 서버와 동물 AI의 관계

이것을 해결하기 위해 분산 서버와 동물 AI의 관계를 분석했다. 그리고 미시적, 거시적으로 나눠 행동과 관계없는 군계, 식생, 물, 건물 등 정적인 정보와 많은 연산량을 요구하는 것은 거시적인 영역. 동물, 사람 등 동적인 정보와 예측 불가능한 것은 미시적인 영역으로 나눴다.



▲ 거시적인 영역과



▲ 미시적인 영역




이렇게 나눴더니 거시 영역은 동물 제어기에서 처리하고, 미시 영역은 무리 AI와 콜로세움 전투 노드로 나뉘게 됐다. 동물 제어기는 식생 시뮬레이터처럼 느린 주기로 실행되는 무리 이동 시뮬레이터다. 만약 평화로운 섬에 인간이 등장해서 건물을 짓게 되면 동물은 이주하게 될 땅을 찾게 된다.

이때 동물 무리마다 지형에 대한 선호도가 다르므로 타일값을 기준으로 후보지를 고르게 된다. 해당 위치에 적대적인 동물이 있으면 낮은 순위로 내려가게 되며, 거리나 식생 등 여러 가지 요건을 고려해서 가장 높은 후보지로 이동하게 된다.




무리 AI는 유저 눈에 보이지 않는 무리를 통솔하는 AI를 추가했고, 이 무리 AI는 개체들의 시야 총합을 갖기 때문에 개체들의 행동을 판단하게 되고, 무리 내 개체들은 무리 AI가 시키는 대로만 행동하게 된다. 이런 무리 AI는 행동 트리로 구현해서 한번 정의된 행동은 다른 모듈에서 재활용하기가 쉽게 만들었다.






▲ 행동 트리 구조로 구현한 무리 AI

전투 노드 콜로세움은 만약 객체가 전투에 참여하게 됐을 때, 그 객체들의 제어권을 넘겨받아 전투를 수행하는 서버 노드다. 기존의 방식은 모든 전투 행위가 노드 간 통신으로 이루어진 방식으로 구현했으나 이러다 보니 반응이 지연되는 경우가 발생했다. 콜로세움 노드를 도입한 결과 공룡과 사용자 간 공격과 방어 타이밍이 어긋나지 않았고, 동물의 텐션 같이 전투 전용의 상태 값을 만들어도 동기화 의존도가 없어서 유용했다.




하지만 여전히 일부 동기화 문제가 남아 있었다. 그래서 동기화를 기다리지 않고, 콜로세움에서 계산한 정보를 믿고 이 정보를 다른 노드에 일방적으로 통보하는 방식으로 의존성을 제거했다. 이렇게 동기화 의존성을 제거한 결과 동물의 위치가 갑자기 변경되거나 그로기, 부위 파괴 등이 한 박자 늦게 발동되는 현상이 일어났다.

이런 문제점을 해결하기 위해 시나리오 패킷을 적용하려고 하고 있다. 콜로세움에서 수립한 전투 계획을 매 이동 시간마다 패킷을 보내는 게 아니라 스케쥴 단위로 시나리오 패킷으로 묶어서 클라이언트에 전송하는 방법이다. 아직 적용은 안 된 상태이며 개발 중이다.



▲ 아직은 개발중인 시나리오 패킷

결론을 말하자면 듀랑고는 계산 프로세스 중심으로 개발하는 것이 목표다. 절차적으로 생성되는 월드, 시뮬레이션 되는 생태계, 사실적이고 생동감 넘치는 환경을 만들기 위해 노력 중이다. 두 번의 테스트를 통해 긍정적인 피드백을 보내주시는 분들이 많아 감사할 따름이다.



▲ 듀랑고의 개발 목표



댓글

새로고침
새로고침

기사 목록

1 2 3 4 5