그럴듯한 랜덤 생성 컨텐츠 만들기

10,764 views

Published on

NDC 2010에서 발표한 자료입니다.

게임에서 랜덤 생성 컨텐츠를 어떤 식으로 만들어낼 수 있는가를 설명합니다.

Published in: Technology, Education

그럴듯한 랜덤 생성 컨텐츠 만들기

  1. 1. 그럴듯한랜덤 생성컨텐츠 만들기<br />신규개발1본부 김용하<br />
  2. 2. 발표자 소개<br />프로그래머, 테크니컬디렉터<br />KUF, 샤이닝로어<br />마비노기<br />마비노기 360<br />마비노기 영웅전<br />그 밖에 접힌 프로젝트 다수… orz<br />면접에서는 랜덤 문제를 반드시 출제하는 랜덤 애호가입니다<br />
  3. 3. 왜 랜덤 생성 컨텐츠가 필요한가<br />시작하기에 앞서…<br />
  4. 4. 컨텐츠 소모 속도가 너무 빠르다<br />한 탕 장사가 아님 | 플레이어님들은 자제하는 법이 없음 | 이 PT만 해도 10배속…<br />
  5. 5. 같은 컨텐츠를 반복 소모<br />같은 자극이 계속 반복되면<br />질린다 = 목표상실<br />플레이어가 돌아오지 않는다<br />UU 감소<br />
  6. 6. AI가 출동하면 어떨까?<br />AI가 컨텐츠를 만들어 준다면!| 아니, 제대로 된 AI가 있다면 그것만으로도 무한 컨텐츠…<br />
  7. 7. 하지만 현실적으로…<br />DIABLO 정도면 엄청 선방 | 컨텐츠추가도 안하는데5년간 10위권…<br />랜덤 던전<br />들어갈 때마다<br />던전 구조가 변경된다<br />랜덤 몹<br />몹 위치와 속성이 바뀜<br />랜덤 아이템<br />아이템 배리에이션이 무한<br />
  8. 8. 랜덤 생성 컨텐츠의 목표<br />Emerging이 아니라 Random !<br />기획자도 생각 못한 쌈박한컨텐츠 만들기<br />- 10개 만들고 100개 처럼보이도록 하기<br />-새로운 자극이 계속 되는 것 같은 착각<br />할 수 없다는 것은 아니지만, 본 발표에서는 커버하지 않습니다<br />컨텐츠에랜덤한배리에이션을 주어<br />컨텐츠량의 수평적인 확장<br />
  9. 9. 본 PT에서 다루는 이슈<br />재료를 어떻게 준비할 것인가<br />그럴듯하게 보이기 위해 필요한 것<br />케이스 스터디<br />캐릭터 생성기| 퀘스트생성기| 던전생성기<br />
  10. 10. 재료를 어떻게 준비할 것인가<br />랜덤 생성에 필요한 재료<br />
  11. 11. 이름 생성기를 만들어 봅시다<br />N = 8<br />그냥 미리 만들어둔 이름을 랜덤 출력<br />물론 이걸 랜덤 생성기라고 할 수는 없습니다 네.<br />
  12. 12. 파트를 나눕니다<br />먼저 단순히 성과 이름으로 나눠 봤습니다<br />컨텐츠의 수 =<br /><PART1 COUNT> x <PART2 COUNT> x …<br />N = 8x8 = 64<br />참 쉽죠 !<br />
  13. 13. 랜덤 생성의 기본<br />배리에이션을 더 늘리고 싶다면<br /> 1. 각 파트 재료의 개수를 늘린다<br /> 2. 파트를 더 나눈다<br />Divide & Conquer로 접근한다<br />이 편이 결과물의 완성도 저하를 최소화 하면서 파트를 나눠갈 수 있음<br />처음부터 ㄱ+ㅏ+ ㅇㅂ+ㅐ+ㄱㅎ+ㅗ+□ 로 나누면 골룸<br />이 얘기는 뒤에도 계속 나와요..<br />Data-Driven<br />각 파트를 쉽게 추가/삭제/수정할 수 있도록 설계<br />SQLITE 쓰세염<br />
  14. 14. 그래서 파트를 더 나눠 봅시다<br />N = 8x8x8 = 512 ?!<br />어라라… 미묘해졌습니다?<br />
  15. 15. 문제 1. 어색한 조합이 생긴다<br />문제 2. 파트 조합이 드러남<br />문제 3. 그냥 다양한 것 만으로는 감흥이 없다<br />컨텐츠의 정합성이 깨짐<br />파트를 나눌 수록 패턴의 반복이 쉽게 눈에 뜨인다<br />게임으로서의 재미를 창출하지 못했다<br />
  16. 16. 재료를 적절히 정의 하고, 조합할 때 필요한 가이드 라인<br />어떻게 그럴듯하게 보이게 할 것인가<br />
  17. 17. 파트 반복을 드러내지 않으려면<br />재료의 개수를 더 늘리면 되지<br />파트 재료가 8개니까 그렇지, 100개면 거의 안 겹치겠죠?<br />무식하지만 확실한 방법<br />반복을 느끼기 힘들도록 순서를 조작<br />Filtered Random을 사용합니다. 뒤에 설명<br />비쥬얼한 파트의 경우, 왕도가 있다<br />컬러 배리에이션, 크기 변경/회전, 데칼은 오프셋 변경…<br />전체 맥락을 해치지 않으면서 다르게 보이도록 함<br />
  18. 18. 순서를 조작하는 이유<br />정직하게 뽑으면 생각보다 반복이 많이 일어남<br />반복이 느껴지면 랜덤 체감률(?)이 떨어짐<br />인간은 동전을 20회 던졌을 때 14회 교대가 일어나는 것을<br />가장 무작위 하다고 느낀다<br />나왔었다는 것을 잊게 만든다<br />인지적으로 처리하는 기억 단위(Working Set)가 평균 7개 이므로,<br />이전 7번 이내에 출현했던 파트는 배제하는 것이 좋다<br />(물론 그러려면 재료 개수가 여덟 개 이상이어야 함)<br />
  19. 19. Filtered Random<br />최근 7번 이내에 나왔던 파트를 또 뽑을 확률은 다음과 같다<br />20% 이하로 하려면 32개,<br />10% 이하는 70개의 재료가 필요 !<br />엄청 저효율 -_-<br />재료 개수<br />
  20. 20. Filtered Random<br />최근 7번 이내에 나왔던 재료를 제거해서 재료가 반복될 확률을 떨어뜨린다<br />한 번 다시 뽑기만 해도 20개의 재료로 반복 확률을 10%까지 떨어뜨릴 수 있다<br />7번 이내에 나왔던 재료를 아예<br />배제하면 당연히 반복 확률은 0%<br />재료 개수<br />
  21. 21. Not Filtered<br />Filtered (Working set = 4) Filtering이 체감 무작위성을 높이는 데는 절대적인 위력을 발휘한다<br />
  22. 22. 어색한 조합은 어떡할겨?<br />이게 가장 어려운 문제<br />완결성이 있는 파트를 사용한다<br />미학적으로 문맥을 깨지 않는 선에서 파트를 나누는 것이 상책<br />예를 들어, 이름의 경우성-이름까지만 나누는 것도 한 방법<br />조합 Rule을 만든다<br /> a. 내재 파라메터를 이용해서 파트를 골라냄 -> 캐릭터 생성기<br /> b. 각 파트를 결합하는 법칙을 적용 -> 퀘스트생성기<br />기각 Rule을 만든다<br />이상한 넘을 골라내는 로직을만드는건 상대적으로 쉽다능<br />Random Filter도 일종의 일반화된 기각 Rule<br />지속적인 튜닝이 필요한 부분<br />
  23. 23. 랜덤 생성기제작 프로세스<br />완결된 컨텐트의프로토 작성<br />조합할 파트 구분, 재료 작성<br />조합 Rule에 따라 컨텐트 생성<br />기각 ?<br />YES<br />NO<br />TUNING<br />생성된 컨텐츠<br />
  24. 24. 랜덤 생성기 튜닝 가이드<br />랜덤 생성 결과를 마음의 눈으로 바라 보며…<br />기각 Rule을 찾아 본다 <br />완성도가 낮은 결과물을 걸러낼 수 있는 방법이 있는가?<br />기각 Rule을 조합 Rule로 환원<br />기각할만한 결과를 사전에 배제할 수 있는 조합 방법이 있는가?<br />파트를 더 나누거나 합한다<br />결과물의 품질을 깨지 않으면서 더 잘게 나눌 수 있는 부분이 있는가?<br />반대로, 품질을 높이기 위해 배리에이션을 포기하고 파트를 합칠만한 부분이 있는가?<br />
  25. 25. 다양한 것 만으로는 부족하다<br />게임으로서 성립하기 위해서는 랜덤에 가치를 부여해야 한다<br />“대박” 이라는 느낌<br /> 특별한 능력치<br />더 예쁜 아이템 : 리블, 리화<br />희소성 있는 아이템<br />적당히 꽝을 넣어 둔다<br />랜덤 조합의 결과가 평등해서는 안된다<br />
  26. 26. 확률 테이블을 정의<br />랜덤 조합에 들어가는 모든 재료에 출현 확률을 지정한다<br />조합 결과에도 확률을 지정한다<br />ex) 특별한 조합을 부스트 하거나… 반대로, 일정 확률로 기각<br />Filtering에 따라 출현 확률이 영향을 받을 수 있으므로 주의<br />
  27. 27. 실제 생성기들을 살펴봅니다<br />이상의 과정에 따라 만들어진…<br />
  28. 28. 캐릭터 생성기: 파트 정의<br />머리카락 파트 재료의 예<br />파트는 트리비얼하게 나눴습니다<br />컬러링 가능 파트 :앞/뒤 머리카락, 얼굴형, 눈<br />컬러 고정 파트: 눈썹, 입, 아이템 (복장), 이름<br />
  29. 29. 캐릭터 생성기: 파트 파라메터<br />일관된 맥락을 가진 캐릭터를 만들어내고 싶다<br />캐릭터를 정의하는<br />다섯개의 성격 축을 설정<br />기획 사양에 따라 정의<br />각 축은 직교성이 있어야 함<br />
  30. 30. 캐릭터 생성기: 파트 파라메터<br />파트마다 해당 파트가 어떤 성격의 캐릭터에 속할 수 있는지를 수치화<br />
  31. 31. 캐릭터 생성기: 파트 조합<br />INPUT<br />캐릭터의 성격을 입력으로 받아<br />입력된 성격에 해당되는 파트 Set을<br />Fuzzy 하게 추려내고, 해당 Set을 가지고 조합<br />
  32. 32. 만들어진 캐릭터의 예<br />
  33. 33. 퀘스트생성기#1 : 착상<br />조합 Rule을 가지고 파트를 결합하는 예<br />일반적인 퀘스트의 구조는 단순<br />“XXX를 얻어와라”<br />“XXX를 얻으려면 YYY를 해야 한다” Cause / Effect<br />전제조건 – 행동 – 결과물 : 퀘스트엔티티<br />전제조건을 결과물로 하는 다른 퀘스트를 연결!<br />Back-Tracking<br />이걸 조합 Rule로 하면 복수개의 퀘스트엔티티를 조합할 수 있잖을까<br />
  34. 34. 퀘스트생성기#1 : 퀘스트엔티티<br /> 전제조건 (Condition), 행동(Action), 결과 (Command)로 이루어짐<br /> 각각의 동작을 몇 가지 명령어(Own, Remove, FinishQuest…)로 기술<br />
  35. 35. 퀘스트생성기#1 : 동작 예<br />
  36. 36.
  37. 37.
  38. 38. 퀘스트생성기#1 : 문제점 <br />단계가 멀어질 수록 인과관계가 옅어진다<br />
  39. 39. 퀘스트생성기#1 : 문제점 <br />전체를 설명하는 텍스트,<br />맥락에 맞는 중간 텍스트 (대사)를 넣기 힘들다<br />파트를 너무 잘게 분해했음 orz<br />
  40. 40. 퀘스트생성기#2 : 착상 <br />이벤트 삽입 방식<br />맥락이 있는 퀘스트 템플릿을 만들고<br />시작 조건, 종료 조건 및 주요 대사를 포함<br />이벤트가 들어갈 빈칸들을 배치해둔다<br />적절한 템플릿을 고르고 빈칸에 이벤트 생성<br />
  41. 41. 퀘스트생성기#2 : 구현 <br />
  42. 42.
  43. 43. 실용 수준의 퀘스트 구현이 가능했음<br />시작 조건, 종료 조건, 중간 정산 및 주요 대사를 포함<br />TODO : Nested 퀘스트<br />이벤트를 넣을 빈칸에 다시 퀘스트를 생성해 넣으면<br />좀 더 퀘스트 단계 수를 늘릴 수 있다<br />
  44. 44. 던전생성기#1 : 방 + 길 <br />가장 흔한 구조죠 네…<br />방을 랜덤하게 뿌려 놓고<br />방들의 출입구를 길로 잇는다<br />각 방에 프랍, 몬스터를 배치<br />Key – Lock 구조의 퍼즐<br />길 부분이 너무 명시적으로 드러남<br />
  45. 45. 던전생성기#2 : 착상<br />모양을 좀 더 다양하게 해보고 싶어서 일반화된 타일을 사용<br />타일을 배치할 GRID에 Main Path를 설정<br />Main Path 기준으로 관문을 설정<br />관문 사이에 Sub Path를 설정하고 타일링<br />퍼즐 및 이벤트 배치<br />
  46. 46. 던전생성기#2 : 생성 프로세스<br />GRAPH 생성<br />타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />
  47. 47. GRAPH 생성<br />타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />GRID 배열<br />
  48. 48. 타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />GRAPH 생성<br />Main Path 생성 (시작 / 끝)<br />난이도 조정 요소 <br />Turning 횟수 : 4<br />전체 경로 : 16<br />
  49. 49. 타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />GRAPH 생성<br />관문(Lock) 설정<br />
  50. 50. 타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />GRAPH 생성<br />관문 사이 구간(Section) 을 확장<br />
  51. 51. 타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />GRAPH 생성<br />관문 사이 구간(Section) 에 Sub-Path 생성<br />
  52. 52. GRAPH 생성<br />타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />Tile 배치<br />불가<br />
  53. 53. GRAPH 생성<br />Key-Lock 배치<br />이벤트 배치<br />타일 배치<br />Tile 배치 – 연결 적합도 판단<br />
  54. 54. GRAPH 생성<br />Key-Lock 배치<br />이벤트 배치<br />타일 배치<br />Tile 배치 – 최적 타일을 배치<br />더적합<br />
  55. 55. GRAPH 생성<br />타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />Lock 포인트에 대해<br />
  56. 56. GRAPH 생성<br />타일 배치<br />이벤트 배치<br />Key-Lock 배치<br />Key를 배치할 수 있는 구간을 탐색<br />
  57. 57. GRAPH 생성<br />타일 배치<br />이벤트 배치<br />Key-Lock 배치<br />Leaf 노드에Key 배치<br />
  58. 58. GRAPH 생성<br />타일 배치<br />Key-Lock 배치<br />이벤트 배치<br />타일의 각 Cell에 이벤트 배치<br />
  59. 59.
  60. 60.
  61. 61. 던전생성기#2 : 아쉬운 점 <br />손으로 만든 것 만큼 예쁘게 나오지는 않음<br />타일을 여러 패턴 준비하기가 힘든 것도 난점 (102 패턴 사용)<br />파트를 너무 많이 쪼갰음<br />결국 나온 것은 맥락 없고 모양만 다양한 던전<br />길찾기 게임으로서는 의미가 있지만…<br />플레이어에게 스트레스를 주기 위한 맵이 되어선 곤란<br />
  62. 62. 던전생성기#3 Todo<br />중요한 것은 플레이어가 던전에서 어떤 다양한경험을 하도록 하는가임<br />던전 템플릿을 만들고,<br />큰 단위의 Tile을 한 두 세트 준비<br />던전Template에 이벤트를 랜덤하게 채워 넣음<br />랜드마크, 아이템 상자, 스폰되는맵,<br />이쪽의 배리에이션을정교하게 만드는 편이 만족도가 높을 것으로 생각됨<br />예) L4D의 AI 디렉터<br />
  63. 63. 결론<br />이상의 내용을 정리해 보겠습니다<br />
  64. 64. 지금까지 설명한 것<br />랜덤 생성에서의 일반적인 이슈와<br />해결에 필요한 접근 방법<br />구체적인 컨텐츠의 랜덤 생성 예<br />캐릭터 생성기, 퀘스트생성기, 던전생성기<br />
  65. 65. 교훈<br />1. 퀄리티는핸드 크래프트한컨텐츠가최고 !<br />만들기도 훨씬 쉽고…<br />2. 하지만, 랜덤 생성도 쓸만합니다<br />컨텐츠를 양적으로 부풀리는 데는 유효한 방법<br />R&D 코스트와 시행착오 과정을 감당할 수 있다면 시도해 보세요<br />3. 처음에 파트를 너무 분해하면 망<br />완성품에서부터 Divide & Conquer로 접근 하는 것이 안전<br />4. 랜덤함에가치를 부여해야 한다<br /> 플레이어가 ‘대박이야’ 라고 느낄 수 있는 순간을 제공해라<br />
  66. 66. Q & A<br />

×