Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

행동 기반 게임오브젝트

7,997 views

Published on

  • Be the first to comment

행동 기반 게임오브젝트

  1. 1. 행동 기반 게임오브젝트 (action based game object) 박성준 (notorz@hotmail.com)
  2. 2. 주제를 시작하기 전에..
  3. 3. 대단하고 화려하고 멋진 설계
  4. 4. 이런것을 소개하려는 것이 아닙니다.
  5. 5. 소개하려는 것은.. 저는 이렇게 만들었습니다..
  6. 6. 행동 기반 게임오브젝트란?• 컴포넌트 기반 게임오브젝트의 일종• 기존 컴포넌트를 컴포넌트, 컨트롤러, 액션으로 나누어 구현• 컴포넌트끼리의 의존도↓, 코드의 재활용↑• 여러 컴포넌트에 접근해야 하는 복잡한 처리도 간단하게 구현 일단 포장부터...
  7. 7. 그 중에서도 가장 중요한 것은행동 기반 게임오브젝트 = 기본적으로 컴포넌트 기반
  8. 8. 아주 조금 다를 뿐입니다. 행동 기반 게임오브젝트기존의 컴포넌트 기반 게임오브젝트
  9. 9. 처음 다닌 게임회사 그리고 첫 게임
  10. 10. Rakion의 게임 오브젝트는.. 이미 서비스중인 게임인 만큼, 굉장히 많이 만들어져 있었고, 컴포넌트 기반 게임오브젝트의 거의 모 든 강연에서 나온 계층구조 설계의 거의 모든 문제점들이 발생하고 있는 상황이었습니다.KASA2008, 김성헌님의 C++ Component System GDC2009, Game Object Component Architecture
  11. 11. 게임 오브젝트여 당신은 누구시길래..
  12. 12. 게임 오브젝트란? 캐릭터• 플레이어, 몬스터 등 캐릭터 레벨 지형• 캐릭터가 서있는 지형• 바위, 나무, 건물 등 배경 오브젝트 오브젝 발사체 프랍• 함정, 회복아이템 등 트리거 트• 미사일, 수류탄, 파편 등• 카메라, 광원 등 카메라 트리거 광원
  13. 13. 게임 오브젝트란? 캐릭터 레벨 지형 오브젝트 상호작용 오브젝 발사체 프랍 트 오브젝트 카메라 트리거 오브젝트 광원 게임 = 게임 오브젝트 사이의 상호작용
  14. 14. 새로운 프로젝트 시작!방을 만들고 들어가서 다른 유저들과 몬스터를 잡고 노는 MO Action RPG를 만들게 되었습니다. 총도 쏘고 칼도 휘두르고 물약도 먹고 같이 공격해주거나 회복시켜주는 기계도 소환하고..
  15. 15. 때가 왔다!엑셀은 밟을 수 없어도 핸들만은 놓치지 않겠어!
  16. 16. 그래서 게임오브젝트를..엑셀은 밟을 수 없어도 핸들만은 놓치지 않겠어!
  17. 17. 사람을 보고 만들었습니다
  18. 18. 조종모델데이터행동
  19. 19. 사람 비슷한 것도..
  20. 20. 조종모델데이터행동
  21. 21. 사람 안 비슷한 것도..
  22. 22. 조종모델데이터행동
  23. 23. 당시 사용했던 구조컨트롤러에서 게임오브젝트에 명령을 주고, 게임오브젝트가 명령을 받으면 액션을 실행합니다. 액션은 모델과 데이터, 게임오브젝트(위치, 회전 등)를 조작합니다.모델 조종데이터 행동
  24. 24. 컨트롤 러 오브젝 트모델/ 액션데이터
  25. 25. 컨트롤조건 검사 러 오브젝 트 모델/ 액션 데이터
  26. 26. 컨트롤조건 검사 러 액션 명령 오브젝 트 모델/ 액션 데이터
  27. 27. 컨트롤 조건 검사 러 액션 명령 액션 명령 다른오브젝트 오브젝 트 모델/ 액션 데이터
  28. 28. 컨트롤 조건 검사 러 액션 명령 액션 명령 다른오브젝트 오브젝 명령에 맞는 액션 실행 트 모델/ 액션 데이터
  29. 29. 컨트롤 조건 검사 러 액션 명령 액션 명령 다른오브젝트 오브젝 명령에 맞는 액션 실행 트 모델/ 액션 데이터 데이터 업데이트 / 기능 수행
  30. 30. 오브젝트엑티브액터
  31. 31. 오브젝트 액션 명령엑티브액터
  32. 32. 오브젝트 액션 명령 엑티브 액터 명령에 연결된 액션서다 달리다 때리다 맞다 죽다
  33. 33. 오브젝트 액션 명령 엑티브 액터 명령에 연결된 액션서다 달리다 때리다 맞다 죽다
  34. 34. 그래서 게임 오브젝트의 구성은..
  35. 35. 플레이어 캐릭터플레이어 캐릭터는 유저의 컨트롤(실제 입력, 네트워크)과 시나리오의 흐름에 영향을 받고, 검과 총 두 가지의 무기를 사용하여 몬스터를 사냥합니다. 따라서 무기를 체인지하면 행동패턴이 달라집니다. UserInputControl ScenarioControl RemoteControl Local인 경우 Remote인 경우 검 Actor 총 Actor 활성화
  36. 36. 플레이어 캐릭터플레이어 캐릭터는 유저의 컨트롤(실제 입력, 네트워크)과 시나리오의 흐름에 영향을 받고, 검과 총 두 가지의 무기를 사용하여 몬스터를 사냥합니다. 따라서 무기를 체인지하면 행동패턴이 달라집니다. UserInputControl ScenarioControl RemoteControl Local인 경우 Remote인 경우 검 Actor 총 Actor 활성화
  37. 37. 회의 중 좀비는 왜 느 그래도 좀비는 린게 컨셉이 걸어서 다가오 지? 무섭지 않 는게 매력이 자나! 있다구!
  38. 38. 회의 중 그럼 뛰어다니 그럼 처음엔 게 만들면 되 걷다가 특정 지! 그런 좀비 조건이 만족되 영화 많자나! 면 뛰자!
  39. 39. 좀비 몬스터처음에는 느리게 걸어 다니면서 몽둥이를 휘두르지만, 데미지를 받아 HP가 30% 이하가 되고 특정 조건이 만족되면 다리가 떨어지면서 팔로 엄청 빠르게 이동을 하고 점프를 하여 입으로 물어뜯는 공격을 합니다. AIControl 몬스터기본공격 몬스터기본이동 Actor 공격 이동데이터1 데이터2 Model1 Model2 변신 전
  40. 40. 좀비 몬스터처음에는 느리게 걸어 다니면서 몽둥이를 휘두르지만, 데미지를 받아 HP가 30% 이하가 되고 특정 조건이 만족되면 다리가 떨어지면서 팔로 엄청 빠르게 이동을 하고 점프를 하여 입으로 물어뜯는 공격을 합니다. AIControl Actor 공격 이동 좀비상체이동 좀비물어뜯기공격데이터1 데이터2 Model1 Model2 변신 후
  41. 41. 하지만 저는 이때..
  42. 42. 바깥세상은 어떤 곳일 까..컴포넌트가 뭔지 몰랐습니다..
  43. 43. 컴포넌트 기반으로게임오브젝트를 만들면 좋데! 오후 4시 30분에 여기에서 발표합니다. 많이 참석해주세요!! 컴포넌트?!
  44. 44. 하지만 이미 프로젝트는 마무리 단계..
  45. 45. 다시 새로운 프로젝트 시작!원작의 유명 대전 격투 게임을 RPG로 재탄생 시킨 사무라이쇼다운 온라인은 Full 3D타입의 쾌적하고 전략성 있는 전투를 추구하며 원작의 방대한 세계관을 그대로 즐길 수 있는 게임입니다.
  46. 46. 지금이다!!컴포넌트! 나도 이 녀석으로게임오브젝트를 만들어보자!
  47. 47. 컴포넌트 기반 게임 오브젝트의 형태게임 오브젝트는 기본적인 데이터만을 가지고 있고, 모든 데이터와 기능은 컴포넌트로 만들어서 게임오브젝트에 붙이는 형태입니다. 오브젝트의 형태별로 필요한 기능만을 가질 수 있도록 설계된 방식입니다. ModelComponent MotionTreeComponent HealthComponent 오브젝 TouchComponent AIComponent 트 MoveableComponent PhysicsComponent TargetableComponent
  48. 48. 하지만 역시 쓰던 것이 편하나 봅니다...
  49. 49. 저는 이런 부분들이 불편했어요잘 알진 못하지만..• 컴포넌트가 다른 컴포넌트를 참조하고 수정하는 경우• 하나의 일을 여러 컴포넌트가 복잡적으로 처리해야 하는 경우• 사실 이렇게 페이지를 하나 쓸 만큼 나쁜 점이 많지 않아요..
  50. 50. 그래서 합쳤습니다..
  51. 51. 오브젝트에 액션 명령 오브젝트가 가지고 있는 기본적인 기능/데이터들배경 투명으로 어떻게 만드나요.. 오브젝트가 명령에 따라 취해야 하는 액션
  52. 52. 컨트롤러 오브젝트에 액션 명령 컴포넌트 오브젝트가 가지고 있는 기본적인 기능/데이터들배경 투명으로 어떻게 만드나요.. 액션 오브젝트가 명령에 따라 취해야 하는 액션
  53. 53. 컨트롤러 UserInputController AIController RemoteController 컴포넌트 ModelComponent 오브젝 HealthComponent 트MoveDataComponent TargetableComponent Drop 액션 Idle ActionTable Struck Move Attack Touch
  54. 54. 컨트롤 러 오브젝 트컴포넌 액션 트
  55. 55. 컨트롤조건 검사 러 오브젝 트 컴포넌 액션 트
  56. 56. 컨트롤조건 검사 러 액션 명령 오브젝 트 컴포넌 액션 트
  57. 57. 컨트롤 조건 검사 러 액션 명령 액션 명령 다른오브젝트 오브젝 트 컴포넌 액션 트
  58. 58. 컨트롤 조건 검사 러 액션 명령 액션 명령 다른오브젝트 오브젝 명령에 맞는 액션 실행 트 컴포넌 액션 트
  59. 59. 컨트롤 조건 검사 러 액션 명령 액션 명령 다른오브젝트 오브젝 명령에 맞는 액션 실행 트 컴포넌 액션 트 데이터 업데이트 / 기능 수행
  60. 60. 행동 기반 게임오브젝트 구조컨트롤러에서 게임오브젝트에 명령을 주고, 게임오브젝트가 명령을 받으면 액션을 실행합니다. 액션은 컴포넌트, 게임오브젝트(위치, 회전 등)를 조작합니다.
  61. 61. 간단히 표현해보면..
  62. 62. 컴포넌트• 독립적인 하나의 기능• 어떠한 일을 하기 위해 쓰이는 데이터• 여러 게임 오브젝트에 붙어 각각의 고유한 기능을 수행• 다른 컴포넌트나 게임오브젝트를 수정하지 않음
  63. 63. 컴포넌트
  64. 64. 공통클라이언트 컴포넌트 베이스서버
  65. 65. 컨트롤러• 게임 오브젝트에 액션 명령• 활성화 / 비활성화가 가능• 컴포넌트나 게임오브젝트를 수정하지 않음• 게임 오브젝트 자체에서 발생되는 액션을 명령
  66. 66. 컨트롤러
  67. 67. 공통클라이언트 컨트롤러 베이스서버
  68. 68. 액션• 게임오브젝트가 해야 하는 어떠한 일• 컴포넌트나 게임오브젝트를 실제로 수정함• 액션 명령을 받으면 명령에 연결된 액션을 실행• 게임오브젝트는 한번에 여러 개의 액션 실행 가능
  69. 69. 액션
  70. 70. 공통클라이언트서버 액션 베이스
  71. 71. 액션 명령• 액션을 실행시키기 위한 명령• 게임오브젝트는 액션 명령을 받고 연결된 액션을 실행• 액션을 실행하는데 사용되는 데이터는 명령에 따라 달라 짐• 액션 명령은 ActionBase 를 직접 상속받은 객체의 RTTI 를 이용
  72. 72. 편의를 위해 매크로를 사용 ActionBase 직접 상속 액션 명령 선언 액션 명령 정의 ActionBase 직접 상속 X
  73. 73. 매크로의 형태 액션 명령 ID 데이터 ActionBase 직접 상속만 허용 RTTI를 사용
  74. 74. 액션 테이블• 게임 오브젝트가 할 수 있는 액션들의 모음• 액션 명령에 액션을 연결하여 저장• 게임 오브젝트는 여러 개의 액션 테이블을 가짐• 액션 테이블에는 레벨이 존재하여 활성화된 액션 테이블 중 레벨이 높은 것부터 액션 명령을 검사
  75. 75. 액션 테이블의 형태 레벨이 높은 액션 테이블부터 실행할 액션 검사 액션 연결활성화/비활성화
  76. 76. 액션 레이어• 게임오브젝트는 액션 레이어를 통해 액션을 실행• 액션의 시작부터 끝까지를 관리• 레이어 개념으로 액션을 실행하여 한번에 여러 개의 액 션을 실행시킴
  77. 77. 액션 레이어의 형태 액션 실행 액션을 실행시킬 레이어
  78. 78. 게임 오브젝트 구성 예시플레이어 캐릭터의 이동을 간단하게 만들어 봅시다
  79. 79. UserInputControllerModelComponent 오브젝트 ActionTable ActionLayer Idle - CharacterIdle
  80. 80. 입력 X 실행 중 액션 X UserInputController Idle 명령ModelComponent 오브젝트 ActionTable ActionLayer Idle - CharacterIdle
  81. 81. 입력 X 실행 중 액션 X UserInputController Idle 명령ModelComponent 오브젝트 Idle 명령에 연결된 액션 검색 ActionTable ActionLayer Idle - CharacterIdle
  82. 82. 입력 X 실행 중 액션 X UserInputController Idle 명령ModelComponent 오브젝트 Idle 명령에 연결된 액션 검색 ActionTable ActionLayer CharacterIdle 실행 Idle - CharacterIdle
  83. 83. 입력 X 실행 중 액션 X UserInputController Idle 명령ModelComponent 오브젝트 Idle 명령에 연결된 액션 검색 ActionTable ActionLayer CharacterIdle 실행 Idle - CharacterIdle CharacterIdle Idle 애니메이션 재생
  84. 84. UserInputControllerModelComponent 오브젝트 ActionTable ActionLayer Idle - CharacterIdle CharacterIdle
  85. 85. UserInputControllerModelComponent MoveDataComponent 오브젝트 ActionTable ActionLayer Idle - CharacterIdle CharacterIdle MoveToPosition - CharacterMoveToPosition
  86. 86. 이동할 위치 클릭 UserInputController MoveToPosition 명령ModelComponent MoveDataComponent 오브젝트 ActionTable ActionLayer Idle - CharacterIdle CharacterIdle MoveToPosition - CharacterMoveToPosition
  87. 87. 이동할 위치 클릭 UserInputController MoveToPosition 명령 ModelComponent MoveDataComponent 오브젝트MoveToPosition 명령에연결된 액션 검색 ActionTable ActionLayer Idle - CharacterIdle CharacterIdle MoveToPosition - CharacterMoveToPosition
  88. 88. 이동할 위치 클릭 UserInputController MoveToPosition 명령 ModelComponent MoveDataComponent 오브젝트MoveToPosition 명령에연결된 액션 검색 ActionTable ActionLayer CharacterMoveToPosition 실행 Idle - CharacterIdle CharacterIdle MoveToPosition - CharacterMoveToPosition
  89. 89. 이동할 위치 클릭 UserInputController MoveToPosition 명령 ModelComponent MoveDataComponent 오브젝트MoveToPosition 명령에연결된 액션 검색 ActionTable ActionLayer CharacterMoveToPosition 실행 Idle - CharacterIdle CharacterIdle CharacterMoveToPosition MoveToPosition - CharacterMoveToPosition
  90. 90. 이동할 위치 클릭 UserInputController MoveToPosition 명령 ModelComponent MoveDataComponent 오브젝트MoveToPosition 명령에연결된 액션 검색 ActionTable ActionLayer CharacterMoveToPosition 실행 Idle - CharacterIdle CharacterMoveToPosition MoveToPosition - CharacterMoveToPosition
  91. 91. 이동할 위치 클릭 UserInputController MoveToPosition 명령 ModelComponent MoveDataComponent 오브젝트MoveToPosition 명령에 위치 값 설정연결된 액션 검색 이동속도 ActionTable ActionLayer 참조 CharacterMoveToPosition 실행 Idle - CharacterIdle CharacterMoveToPosition MoveToPosition - CharacterMoveToPosition
  92. 92. UserInputControllerModelComponent MoveDataComponent 오브젝트 ActionTable ActionLayer Idle - CharacterIdle MoveToPosition - CharacterMoveToPosition
  93. 93. 어쨌든..
  94. 94. 게임오브젝트 구성을 쉽게!!
  95. 95. Q&A
  96. 96. 감사합니다 박성준 notorz@hotmail.com

×