UnityML을 활용한 Game Solver 개발

유효성 검사와 난이도 검증

 

퍼즐 게임에서 신규 레벨을 제작할 때 고려해야 하는 여러 요소 중 ‘유효성 검사’와 ‘난이도 검증’이라는 것이 있다.

전자는 해당 레벨을 정상적으로 플레이할 수 있는지 여부를 테스트하는 것이고, 후자는 해당 레벨이 유저가 플레이하기에 적당한 난이도를 지닌 것인지 여부를 테스트하는 것이다.

두 요소 모두 컴퓨터 프로그램 등을 통해 기계적으로 검사하기엔 무리가 있다. 복잡하게 얽혀 있는 퍼즐을 풀 수 있는 궁극의 정책같은 것을 생각해내기는 어렵기 때문이다.

이에 따라 일반적으로 사람이 직접 해당 레벨을 플레이하여 두 요소를 검증하는데, 이러한 방식은 문제가 있다.

레벨의 난이도를 검증하는 데에 있어서 측정자의 주관이 개입되어 검증에 영향을 끼칠 수 있으며, 측정자가 게임을 플레이하면서 해당 게임에 익숙해져 영향을 끼칠 수 있다.

 

AI 도입을 통한 문제 해결

 

위에서 언급한 문제점들을 해결하기 위해 AI를 도입하려고 한다. AI에게 게임을 학습시켜 일정 수준을 유지시키면 주관이 개입되는 문제를 해결할 수 있고, 게임을 플레이하면서 익숙해지는 현상도 방지할 수 있다. 더불어 사람이 직접 플레이하는 것보다 월등히 더 빠른 속도로 검증할 수 있다.

Unity에서 제공하는 UnityML 패키지를 활용하면 손쉽게 AI를 적용해볼 수 있는데, 아래는 BitMango 게임 중 bunnypoprescuepuzzle에 적용한 것이다.

bunnypoprescuepuzzle

UnityML을 적용하면서 AI 알고리즘으로는 PPO를 사용하였고, 하이퍼 패러미터는 기본값을 거의 그대로 사용하였다. 여기에 추가로 Curriculum Learning 기법을 적용하였는데 이 역시 UnityML에서 제공하는 기능이다.

 

AI의 학습곡선

 

위 그래프는 학습곡선으로 AI의 학습 진행상황을 그래프로 나타낸 것이다. 각 curriculum 시작시 reward가 추락하였다가 학습이 진행되면서 상승하고 일정 수치를 달성하면 다음 curriculum을 시작하는 것을 확인할 수 있다.

UnityML을 적용하면서 직면한 문제가 있었는데 이는 학습에 걸리는 시간이었다. Unity Blog(link)에서 버블팝 장르의 게임에 UnityML을 적용한 사례를 소개하고 있는데, 어려운 레벨일수록 학습 시간이 오래 걸려 해당 사례에서는 25번째 레벨을 학습하는 데에 60시간이 걸렸다고 한다. bunnypoprescuepuzzle 또한 학습 시간이 너무 오래 걸리는 문제점을 겪고 있다.

출처 : Unity Blog(link)

 

사례에서는 학습시간을 단축하기 위하여 UnityML에서 제공하고 있는 기능인 다중 인스턴스를 통해 동시 학습하는 방식을 사용하였다. 하지만 bunnypoprescuepuzzle의 경우 SMF 엔진을 사용하고 있어 UnityML에서 제공하고 있는 다중 인스턴스 기능을 사용할 수가 없다.

학습시간을 단축시키기 위하여 UnityML에서 제공하고 있는 Time Scale을 올리는 방식도 사용해보았으나, 실제 시간을 측정했을때 별다른 차이가 없었다. 대신 tween을 제거하는 방식을 시도해보았다. 게임의 로직상 tween을 완전히 제거할 수는 없었으나, 이전에 비해 학습시간을 크게 단축시킬 수 있었다.

 

bunnypoprescuepuzzle

여기까지는 Unity 에디터를 통해 UnityML을 적용하는 방식이였는데, Unity에서 제공하는 파이썬용 UnityML 패키지(mlagents)를 사용하면 다중 인스턴스 학습 방식을 구현할 수 있는 것으로 보인다.

 

 

추가적으로 UnityML에서 제공하는 기본 모델은 1차원 array를 인풋으로 받는 단순한 형태인데, 파이썬 패키지를 활용하여 이보다 좀 더 고차원적인 모델을 사용하면 학습시간을 더 단축시킬 수 있을 것으로 기대한다.