GDC 2014 Ellie: Buddy AI In The Last Of Us. by, Max Dyckhoff
all copyright to GDC, Naughty Dog and Max Dyckhoff

DISCLAIMER

현 자료는 Naughty Dog의 Max Dyckhoff 님 께서 GDC 2014 에서 발표하신 Ellie: Buddy AI In The Last Of Us 의 발표 자료 내용입니다. 모든 내용은 영상을 보며, 작성하였으며, 본인 개인의 공부 목적으로 간단하고 짧게 정리한 내용이라, 부정확한 정보가 존재하니 이점 유념하여 봐주시길 바랍니다.

또한 당장 제게 필요했던 부분만 정리했기에, Combat 부분의 자료는 정리하지 않았습니다. 이점 유의해주시길 바랍니다.

Ellie AI 캐릭터의 핵심은 플레이어와 가까운 위치에 위치시키고, 근처 AI가 여러 가끔씩 유용하게 사용될 수 있게하고, 관심을 계속 붙들 수 있는 방식을 설정했다.

플레이어와 Ellie의 서바이벌을 담은 게임이기 때문에 그럴만도 하다.

Dont’t cheat의 의미는 따라다니는 Ellie 캐릭터가 텔레포트하거나, 필수 자원을 퍼주고 공격을 너무 잘하는 것 같이 필요이상의 기능을 주지 않고 움직임도 항상 걸어서 위치까지 이동하도록 하는 것.

목차

  1. Ambient Following (주변 환경에 관한 플레이어를 따라가는 것에 대한 부분들)
  2. Combat Following (전투가 일어나거나 급박한 상황에서의 전략이나 플레이어를 따라가는 것에 대한 부분들)
  3. Summary (결론)
  4. Q&A

Ambient Following

Positioning (이동 위치 선정)

이동 위치 선정은 LineTrace를 많이 사용해서 진행한다.

LineTrace를 사용해 이동할 위치를 정하는 방식 설명

평가하고 정렬해 포지션을 구한다. 평가할 요소들은 아래와 같다.

노출되었는지, 이상적인 위치와, 이상적인 앵글, 위험으로 부터의 거리, 플레이어로 부터의 거리, 아군으로 부터의 거리 등등.

위의 평가는 먼저 LineTrace를 통해 동료가 이동할 거리를 구하고 평가한다.

플레이어가 있다.

플레이어 뒤에 특정한 각도로 동료 AI가 있을 위치와 거리를 적당히 둔다.

동료 AI가 이동하려는 곳중 플레이어로부터 이동가능한 위치까지 LineTrace를 해서 부딪히는 것이 있나 확인한다.

부딪힌 부분은 후보군에서 제외한다.

이제 플레이어의 캐릭터 앞 방향으로 또 한 번 LineTrace를 해서 맞는 부분이 있나 체크한다.

맞은 부분이 있다면 후보군에서 제외한다. 그리고 앞 방향으로 LineTrace를 한 부분의 위치를 두고

그 위치에서 플레이어 방향으로, 또는 위치에서 플레이어 방향으로 마지막 LineTrace를 진행해 남아있는 후보군에서 이동할 위치를 고른다.

(플레이어 방향으로 마지막에 레이를 쏘는 이유는 아래와 같다.)

플레이어 옆에 벽을 하나 두고 위의 방법처럼 LineTrace를 쏴서 후보군이 하나 없어졌다.

앞으로 LineTrace를 해서 나온 값은 위와 같다. 그런데, 만약에 저게 방이었다면, AI는 문 밖으로 나갈 것이다. 그럼 한 방에 같이 있지도 않고 문제가 생기고 이상하다.

그래서 그러한 문제를 없애기 위해 플레이어쪽으로 LineTrace를 진행해 문제될 벽이나 오브젝트가 없나 판별힌다. 만약 있다면 후보군에서 그 위치를 없앤다.

최종적인 이동 위치는 저 3개의 초록점 중 하나이다.

실제 너티독 자체 엔진에서 이동 방향을 구하는 방식의 모습.

Moving (이동 방법과 상황을 설정)

위의 방법대로 Positioning을 완료 하면 이제 움직일 차례이다.

Moving

움직임에는 항상 어떠한 의도가 들어있어야하고 괜히 움직이거나 갑자기 커버모드에 들어가는 부분을 막기 위해 Locomotion Log 를 조사해 의도된 방식대로 움직이지 않을 경우 움직이지 말라는 컨디션을 넣고, Hysteresis(이력현상)를 추가해서 설정해둔 경우에만 움직이도록한다.

그래서 AI 스스로가 포인트를 고르고 필요하지 않은 움직임을 최소화 하며, 정말 필요한 경우 움직이도록 만들었다고 한다.

Following

걷고 달리고 뛰는 움직임에 관해서는 스피드 스케일링을 적용했다고 한다. (Blend Space 관련인 듯)

스피드 스케일링은 거리 유지를 위해 너무 가깝거나 너무 멀경우에 플레이어와 일정 거리를 유지하기 위해 조금씩 값을 스피드 값을 변경하며 달릴지 뛸지 아니면 걸을지를 결정하게 하는 것이다.

다만, 캐릭터자체의 움직임 모드는 Walk->Run→Sprint로 나누어지지 않고, 항상 플레이어와 일정한 거리를 잘 유지하며 달려나간다. (Blend Space처럼 자연스럽게 움직인다는 말인듯)

Dodging

Dodging은 플레이어가 가려는 방향에 동료 AI 가 서있을 경우 길을 비켜주는 것을 말한다.

현실에서는 누군가 길에 서있으면 조금 돌아가거나 비켜가는게 기본인데, AI 방향으로 달려갈 경우, Ellie의 경우 그 자리를 고수하고, 계속 그 길을 플레이어가 가려고 할 경우 조금 있다가 비켜주되, 이상적인 방향으로 이동하고, 불평하는 액션을 취한다.

Teleporting

Teleporting은 특정 시퀀스 구간에서 정말 필요하지 않다면 전혀 사용하지 않았다고 한다.

애니메이터와 디렉터가 발자국과 관련된 시스템이 이상하게 작동하는 것을 원치 않았고, 이곳 저곳에서 동료 AI가 튀어나오면 유쾌하지 않은 경험이기 때문이라고 한다.

원리원칙에 따르고싶지 않았기도 했다고 한다.

Teleporting 같은 억지로 캐릭터를 어딘가에 끌어다 놓거나 하는 것을 Cheat로 규정할 정도로 싫어한듯 하다.

Combat Following

Action Packs (AI 전용 환경 상호작용 시스템)

액션팩은 잠재적으로 AI나 캐릭터가 상호작용할 수 있는 것들을 미리 정해둔 것이다.

액션팩에는 Location과 Rotation 그리고 이런저런 Meta Data(애니메이션 팩 등등)들이 들어있다고 한다.

3가지 타입의 액션팩들이 존재하고 그 용도는 다음과같다.

  • Cinematic Action Packs : 서랍을 열거나, 문을 열거나 하는 액션용
  • Traversal Action Packs : 사다리를 타거나, 벽이나 창문을 넘어가거나, 착지하거나 하는 액션용
  • Cover Action Packs : AI를 서있게, 앉게, 기어가게 하거나 적으로 부터 숨어 이동하는 것들에 초점이 맞춰진 액션용

Valulting에 관한 액션팩이 실제 엔진상에 있는 모습, 창문틀에는 로케이터가 있고, 바닥에 있는 선을 AI가 근접하게 된다면, 상황을 보고 (플레이어가 밖에 있는지 등등) 액션팩을 이용한다고 한다.

Cover에 관한 액션팩이 실제 엔진상에 있는 모습, 대부분의 저런 커버관련 액션팩은 툴이 자동으로 생성해준다고 한다. 다만 툴이 완전 정확하진 않아서 앞에 흰 차의 오른쪽 앞 부분에 액션팩이 없는 걸 볼수있는데,

툴이 저 부분은 공간이 너무 협소해 커버가 불가능하다고 판단해 저렇게 들어가있는 것이라고 한다. 그래서 수작업으로 툴이 넣지 않은 커버 액션팩이라고 하더라도, 있어야 한다고 생각하는 곳에는 액션팩을 놓아주는 작업을 추가로 진행했다고 한다.

인간형 AI (적대적인 생존자)는 액션팩을 이용하되, 클리커같은 비 이성적인 캐릭터들은 액션팩을 이용하지 못하게 했다고 한다.

플레이어는 어느곳에서나 대부분 몸을 숨기는 작업을 할 수 있고, 동료 AI는 왠만한 상황에서 플레이어가 몸을 숨긴 근처에 Procedural 하게 생성된 커버 액션팩을 이용한다.

Procedural 하게 생성된 커버 액션팩은 Runtime Cover AP 라고 부른다고 한다.

하지만 Runtime Cover AP는 너무나도 비싼 방법이라고 한다.

플레이어로부터 LineTrace를 원을 그리며 80개 정도를 쏴서 부딪힌 면들을 Cover Edge라고 칭해 하나의 벽으로 인식시킨 뒤,

값을 매겨 Cover Edge에 Cover Action Pack을 심는 방법이라고 한다. (Uncharted 3 에서도 사용한 방법이라고 한다) 

Cover Edge를 만들기위한 방법은 아래와 같다.

플레이어를 중심으로 80개 정도(TLOU 기준 80개)의 LineTrace를 약 1미터만큼 진행해 맞은 부분을 모두 찾는다.

맞은게 뭔지 보고 그룹으로 나눈다. 맞은 앵글, 높이 그리고 표면에 대한 정보를 받는다. 다만 표면의 정보는 큰 오차가 있지 않는이상 조금 울퉁불퉁해도 하나의 표면으로 인식하도록 했다.

위처럼 Cover Edge가 나올텐데 저정도의 정보만으로는 만족스러운 결과를 얻지 못했다.

그래서 이걸 매 프레임마다 누적시켜 지도를 완성하듯이 확장해 나간다고 한다.

살짝 움직인 뒤 추가적으로 늘어난 Cover Edge.

만든 Cover Edge들을 평가해 어디로 어떻게 이동할지 정한다.

평가에 관여하는 요소들은 아래와 같다.

  • 플레이어와 얼만큼 멀리있는지
  • 위협적인 요소들과 얼만큼 떨어져 있는지
  • 플레이어보다 뒤인지 앞인지
  • 등등

결과적으론 대부분의 경우 플레이어 근처에 커버하러 온다고 한다. 만든 엣지가 적들에게 보일지도 평가요소에 들어가는데 적이 Edge를 탐색하려고 LineTrace를 하거나 하진 않는다고 한다 (엄청 무겁다고 한다)

커버할 위치가 정해지면 그곳으로 이동과 동시에 로코모션 시스템이 Procedural 하게 생성된 커버 액션팩을 읽어 알아서 결정한다고 한다.

Procedural Cover (Cover Edge)에 관한 액션팩이 실제 엔진상에 있는 모습, 표면상의 Edge들을 모두 구해 위와같은 평가가 이루어지면 동료 AI가 그곳으로 이동.

Explore (AI의 탐험에 대하여)

플레이어가 자원을 찾기 위해 이곳 저곳을 돌아다녀야 한다.

그동안 Ellie 동료 AI도 가만있지 말고 뭔가 하는 액션을 취하고있는게 좋다.

디자이너들이 동료 AI가 돌아다닐 위치 포인트들을 미리 잡아두고 Ellie를 움직이게 한다.

위치포인트는 랜덤하거나 순서대로 움직일 수 있고, 위치에서는 무언갈 보거나, 플레이어가 근처라면 플레이어를 보고, 특정 위치에 무언가 있다면 알아서 상호작용할 수 있게 했다.

Explore에 관한 이동 포인트나 행동 포인트들이 실제 엔진상에 있는 모습.

Multiple Buddies (동료 AI가 하나 이상일 경우)

특정 챕터에서는 동료 AI가 3개나 존재했다고 한다.

메인 동료 AI를 제외하고 그 외의 일시적인 동료 AI들은 약간의 Cheating을 허용했다고 한다.

Nav Mesh가 겹칠 경우 아주 잠깐동안 Nav Block(Blocking Volume 또는 Character Capsule이 될듯)을 서로 뚫고 지나가게 했고, 아주 빨리 움직여 눈치체기 힘들게 했다.

Traversal Action Packs의 경우 하나만 두면 병목현상이 발생해 여러개를 배치해 자연스럽게 움직이도록 만들었다고 한다.

Summary (결론)

포지셔닝을 알맞게 하기 위해 많은 공을 들였다.

너티독의 모든 인원들은 디테일에 엄청난 집착을 갖고있다.

시간을 많이 잡아먹는 튜닝에도 여유가 있다면 시간을 투자해 지속적으로 발전시켜라. (출시 5달 남기고 AI를 갈아엎어서 그런가봄)

Really big timers (?) : 시간을 많이 잡아먹는 작업이라는 것을 뜻할수도 있고, 기능이 아주 가끔 작동한다는 뜻으로도 해석할 수 있을 것 같지만 잘 이해가 가질 않는다.

Q&A

Q : 커버 액션팩을 배치했는데 왜 또 굳이 Procedural Cover를 사용했는지 궁금하다.

A : 미리 배치한 커버 액션팩은 너무 부족했다. 맵 전체를 커버할 만큼 충분히 정확하지도 않았고, 환경이 분리될 경우 커버 액션팩이 5미터가 넘는 거리에 있던가 하는 문제들이 있었다.

우리는 Ellie가 최대한 항상 플레이어 근처에 있었으면 했고, 우리가 Cover Edge나 커버 액션팩을 더 만들 수 있었지만, 그건 다른 또다른 문제일 것 같다.

Q : 플레이어의 시네마틱 킬이 이루어지는 동안 동료 AI들과 적들은 어떻게 되는 것인가?

A : 전부 잠깐 멈추고 화면에 렌더하지 않는다. 시네마틱킬에만 집중하면 되기 때문이다.