Search Unity

게임 제작은 게임 컨셉 및 로직 정의, 에셋 및 애니메이션 제작, NPC 동작 지정, 난이도 및 밸런스 조정, 출시 전 실제 플레이어를 통한 게임 테스트 등 여러 까다로운 작업이 수반되는 창조적 과정입니다. 유니티는 이러한 전체 제작 과정에서 머신러닝을 활용하는 것이 가능하다고 생각합니다. 이 블로그 게시물에서는 앞서 말한 까다로운 과제 중 하나인, NPC의 동작 지정에 관해 집중적으로 살펴보고자 합니다.

전통적으로 NPC의 동작은 스크립팅과 동작 트리(behavior tree)를 사용하여 하드코딩으로 구현됩니다. 일반적으로 길고 복잡한 이러한 규칙들은 NPC 주변의 정보를 처리(관찰(observation)이라고 함)하여 다음 액션을 지시합니다. 이 규칙들은 작성에도 시간이 걸리지만 게임을 업데이트할수록 유지관리에 많은 시간이 소모됩니다. 강화 학습은 NPC 동작을 정의하는 이와 같은 방법을 대신할 유력한 프레임워크를 제시합니다. 구체적으로 이야기하자면, 지금처럼 수고스럽게 관찰을 정의하여 액션을 일일이 매핑할 필요 없이, NPC가 지정된 목적을 달성할 때 보상을 제공하는 방법으로 NPC를 훈련시킬 수 있습니다.

강아지 훈련 방법의 원리

강화 학습을 사용하는 NPC 훈련은 강아지에게 물어오기 훈련을 시키는 것과 아주 비슷합니다. 먼저 강아지에게 먹을 것을 보여준 다음 막대기를 던집니다. 강아지는 처음에는 무엇을 해야 할지 몰라서 서성거리다가 결국 막대기를 물어오고 그 즉시 간식을 얻게 됩니다. 이 과정을 몇 차례 반복하면, 강아지는 막대기를 물어오면 간식을 얻는다는 것을 깨닫고 계속 그렇게 행동합니다.

NPC 동작 훈련에 적용되는 강화 학습의 원리가 바로 이것입니다. NPC가 작업을 올바르게 완료할 때마다 보상을 제공하는 것입니다. 여러 차례의 반복적인 게임 시뮬레이션을 통해(즉, 물어오기 과정을 여러 차례 반복하는 것과 같음), NPC는 보상을 최대화할 수 있는 액션에 대해 자체적인 모델을 구축하며 결과적으로 이상적이고 바람직한 동작을 도출할 수 있습니다. 따라서 로우레벨에서 NPC의 모든 관찰마다 액션을 생성하고 유지할 필요 없이, NPC가 작업을 올바르게 완료했을 때 높은 수준의 보상을 제공하기만 하면 NPC는 적절한 로우레벨의 동작을 학습하게 됩니다

퍼포 더 코기

유니티에서는 이 기술의 효과를 실례로 제시하기 위해 “퍼포 코기(Puppo, The Corgi)라는 데모 게임을 제작하여 유나이트 베를린에서 발표했습니다. “퍼포 더 코기”는 귀여운 코기 강아지와 물어오기 놀이를 하는 모바일 게임입니다. 화면을 터치해서 막대기를 던지면 퍼포가 막대기를 물어옵니다. 고수준의 게임 로직에서는 기존의 스크립트 방식을 사용하지만, 이 코기 강아지는 강화 학습을 이용하여 걷기, 달리기, 점프, 물어오기 행동을 배웁니다. 코기 강아지의 행동은 애니메이션이나 스크립트로 지정한 동작을 사용하지 않고 강화 학습으로만 훈련됩니다. 이 코기 강아지의 동작은 아주 귀엽기도 하지만 무엇보다 물리 엔진으로만 구동된다는 점이 특징입니다. 이는 코기의 동작이 주위의 리지드바디(Rigidbodies)*로부터 영향을 받는다는 의미입니다.퍼포는 유나이트 베를린에서 크게 인기를 끌었고 그 구현 방식에 대해 질문하는 개발자가 많았습니다. 그래서 여러분이 직접 구현해볼 수 있도록 블로그를 통해 프로젝트를 공개하기로 결정했습니다.

*참고: 리지드바디는 게임 오브젝트가 물리 엔진의 통제하에 작동하도록 합니다. 즉 주변으로부터 힘과 토크의 영향을 받아 물체가 물리 법칙에 따른 움직임으로 현실감을 높여 줍니다. 예를 들어 모든 게임 오브젝트는 중력의 영향을 받거나 스크립팅을 통해 추가된 힘의 영향으로 움직이기 위해, 그리고 다른 객체와의 물리적 상호작용을 위해 반드시 리지드바디 컴포넌트를 포함해야 합니다.

 

Unity 프로젝트 다운로드

 

시작하기에 앞서, 코기 훈련에 필요한 요구 사항과 예비 작업에 대해 먼저 알아본 뒤에 유니티에서 체험한 훈련 경험을 공유하고, 마지막으로 우리의 귀여운 퍼포를 이용해 게임을 제작했던 과정에 대해 이야기해 보겠습니다.

예비 작업

세부 사항에 들어가기 전에, 강화 학습의 몇 가지 중요한 개념을 정의해야 합니다. 강화 학습의 목적은 에이전트정책 학습입니다. 에이전트는 환경과 상호작용하는 엔티티를 말합니다. 에이전트는 모든 학습 단계에서, 환경의 상태에 관해 관찰을 수집하고 액션을 수행하여 그에 대한 보상을 얻습니다. 정책은 에이전트가 스스로 인식하는 관찰에 근거하여 행동하는 방식을 정의합니다. 에이전트의 동작이 적절할 때 보상을 제공하는 방식으로 정책을 발전시킬 수 있습니다.

이 게임에서는 게임 씬이 환경이고, 퍼포가 에이전트입니다. 퍼포는 플레이어와 물어오기 놀이를 하려면 정책을 학습해야 합니다. 실제 강아지에게 간식을 주고 막대기 물어오기 훈련을 시키듯이, 퍼포에게도 적절한 보상을 제공하면서 훈련시킬 수 있습니다.

퍼포를 만들 때는 래그돌(ragdoll)이 사용되었고, 퍼포의 다리는 조인트 모터로 구동됩니다. 따라서 퍼포는 먼저 조인트 모터를 회전하여 움직이는 방법을 익혀야만 타겟에 다가가는 방법을 배울 수 있습니다.

실제 강아지는 시각과 기타 감각을 사용하여 방향을 설정하고 이동할 곳을 결정합니다. 퍼포 역시 같은 방법을 사용합니다. 퍼포는 타겟과의 근접성, 자신과 타겟 간의 상대적 위치, 다리의 방향 등 씬에 대한 관찰정보를 수집한 후 다음 액션을 결정합니다. 퍼포의 경우에는 이동하기 위해 조인트 모터를 회전하는 방식이 곧 액션이 됩니다.

퍼포가 액션을 수행할 때마다 에이전트에게 보상이 제공됩니다. 보상은 다음 항목들로 구성됩니다.

  • 방향 보너스: 퍼포가 타겟을 향해 이동할 때 보상을 줍니다. 여기에 사용하는 것이 Dot() 메서드입니다.
  • 시간 벌칙: 퍼포에게 모든 액션마다 고정된 벌칙(부정 보상)이 주어집니다. 이렇게 해서 퍼포는 시간에 대한 벌칙을 피하기 위해 최대한 빠른 속도로 막대기를 가져오도록 학습합니다.
  • 회전 벌칙: 퍼포가 너무 많이 회전할 때 벌칙을 줍니다. 실제 강아지라면 과하게 회전할 경우 어지러움을 느낄 것입니다. 보다 현실감을 부여하기 위해, 퍼포가 너무 빠르게 돌 때 벌칙을 줍니다.
  • 타겟 도달 보상: 무엇보다 가장 중요한 것은 퍼포가 타겟에 도달할 때 보상을 주어야 합니다.

 

퍼포 훈련

이제 퍼포가 학습할 준비가 되었습니다. 퍼포가 효율적으로 타겟을 향해 뛰어가는 것을 익히기까지 노트북에서 두 시간이 걸렸습니다. 훈련 과정 중에 한 가지 흥미로운 동작을 발견할 수 있었습니다. 퍼포는 약 1분이라는 짧은 시간 동안 걷기를 익혔고, 훈련을 계속하면서 달리기를 학습했습니다. 그런 다음 금세 달리는 도중 급회전할 때 몸을 뒤집기 시작했습니다. 다행히 퍼포는 실제 강아지처럼 다시 일어나는 법을 배웠습니다. 서투른 이 동작이 너무 귀여워서 이 부분에서 학습을 중단시키고 게임에 직접 적용해 보셔도 좋습니다.

 

직접 퍼포를 훈련시켜 보려면 이 프로젝트의 지침대로 따라해 보시기 바랍니다. 이 지침에는 훈련 준비 방법과 선택한 파라미터의 유형에 관한 세부적인 단계들이 제시되어 있습니다. 에이전트 훈련에 관한 자세한 내용은 페이지에서 확인하실 수 있습니다.

퍼포로 게임 만들기

“퍼포 더 코기” 게임을 제작하려면 플레이어와 훈련된 모델 간의 상호작용을 지원하는 게임 로직을 정의해야 합니다. 퍼포는 타겟을 향해 달려가도록 학습했기 때문에 게임에서 퍼포의 타겟을 변경하는 로직을 구현해야 합니다.

게임 모드에서 플레이어가 막대기를 던진 직후에 타겟을 막대기로 설정합니다. 퍼포가 막대기에 도달한 뒤에는 퍼포가 막대기를 물고 돌아올 수 있도록 씬에서 퍼포의 타겟을 플레이어의 위치로 변경합니다. 이렇게 하는 이유는 게임의 흐름에 관한 로직을 스크립트로 정의하고 퍼포를 타겟으로 이동하도록 훈련하는 것이 훨씬 더 쉽기 때문입니다. 머신러닝과 기존의 게임 개발 방법을 결합함으로써 두 가지 접근법 모두를 최대로 활용할 수 있다고 생각합니다. “퍼포 더 코기” 프로젝트에 포함된 코기는 사전에 훈련이 되어 있는 모델이므로 즉시 사용이 가능하며, 모바일 디바이스에 바로 배포할 수 있습니다.

다음 단계

이 블로그를 통해 여러분이 게임 개발에서 ML-Agents 툴킷을 유익하게 활용할 수 있는 방법을 이해하는 데 도움이 되었기를 바랍니다.

이 프로젝트의 코드를 자세히 살펴보고자 하는 분들을 위해 유니티는 해당 프로젝트를 공개했으며, 여기에서 다운로드할 수 있습니다. ML-Agents 툴킷의 사용 방법에 대한 자세한 내용은 유니티의 공식 참고 자료 및 단계별 입문자 가이드에서 확인하실 수 있습니다. 강화 학습에 관한 수학, 알고리즘 및 이론을 더 살펴보려면 유니티가 Udacity와의 파트너십을 통해 제공하는 강화 학습 나노디그리를 참조하십시오.

ML-Agents 툴킷을 게임에 사용해보고 그 경험을 공유해 주십시오. 언제든 GitHub 이슈 페이지를 방문하거나  이메일을 통해 직접 의견을 보내 주시기 바랍니다.

즐거운 제작 경험을 누려 보세요!

 

10 코멘트

코멘트 구독

코멘트를 달 수 없습니다.

  1. Is the code for machine learning models behind Puppo written in Python or any other language?

    Thanks,
    https://honingds.com

  2. online data science course

    11월 13, 2018 11:22 오전

    Interesting article, thanks for the same. To summarize, data science and machine learning can be used to define game logic and mimic the actions of real world players.

  3. 재미있고 머신러닝에 대한 이해를 쉽게 해주는 그런 내용인 것 같습니다. 번역되어 올라오는 글들은 모두 챙겨보고 있는데… 새로운 기술들을 이해하는데 많은 도움이 됩니다. 감사합니다.

  4. Thank you very much for the blog which is translated and re-posted in Korean. I would highly appreciate that the quality of translation is getting better and better. In addition, this posting includes a transliteration note (about rigidbody) not found in the original English text, which seems to be helpful for beginners. I think that the direction of Korean translation has been set up properly. I look forward to seeing progress continuously.

  5. It is good to know about how these works are done by defining a correct reward.
    Hope to read more posts like this one.

  6. I got very interested in this so I downloaded the pack and have tried to compile with the latest version of Unity and Unity Editor (2018.2.11f1) Followed all instructions in the attached pdf but the editor actually crashes and shuts down. Anyone else who had this issue and solved it? Also tried to compile a standalone both Windows PC version and WebGL but it does not seem to work completely.

    1. Sorry to hear that it didn’t work for you. We will attempt to reproduce this issue on our end. In the meantime, would you please post an issue on the ML-Agents GithHub page or send an email to ML-Agents@unity3d.com so we can connect and help resolve?

      1. Is there a logfile or something that I could send together with the report?

  7. Interesting topic depicted in a cute way is a key in education of young audience. Good work.

  8. Terry Scrimsher

    10월 2, 2018 10:33 오후

    I remember seeing @punchesbears work on this on a live stream a few months back.