행동 기반 게임오브젝트
Transcript of 행동 기반 게임오브젝트
행동 기반 게임오브젝트(action based game object)
박성준([email protected])
주제를 시작하기 전에 ..
대단하고 화려하고 멋진 설계
이런것을 소개하려는 것이 아닙니다 .
소개하려는 것은 ..
저는 이렇게 만들었습니다 ..
행동 기반 게임오브젝트란 ?
게임 오브젝트 설계의 중요성
행동 기반 게임오브젝트의 개념
컴포넌트 기반 게임오브젝트
행동 기반 게임오브젝트
행동 기반 게임오브젝트란 ?
• 컴포넌트 기반 게임오브젝트의 일종
• 기존 컴포넌트를 컴포넌트 , 컨트롤러 , 액션으로 나누어 구현
• 컴포넌트끼리의 의존도↓ , 코드의 재활용↑
• 여러 컴포넌트에 접근해야 하는 복잡한 처리도 간단하게 구현
행동 기반 게임오브젝트란 ?
일단 포장부터 ...
그 중에서도 가장 중요한 것은
행동 기반 게임오브젝트 = 기본적으로 컴포넌트 기반
아주 조금 다를 뿐입니다 .
기존의 컴포넌트 기반 게임오브젝트
행동 기반 게임오브젝트
행동 기반 게임오브젝트란 ?
게임 오브젝트 설계의 중요성
행동 기반 게임오브젝트의 개념
컴포넌트 기반 게임오브젝트
행동 기반 게임오브젝트
게임 오브젝트 설계의 중요성
처음 다닌 게임회사
그리고 첫 게임
Softnyx( 특히 Rakion 팀 ) 는 쾌적하고 깨끗하고 밝은 분위기의 좋은 회사입니다 .
KASA2008, 김성헌님의 C++ Component System GDC2009, Game Object Component Architecture
Rakion 의 게임 오브젝트는 ..이미 서비스중인 게임인 만큼 , 굉장히 많이 만들어져 있었고 , 컴포넌트 기반 게임오브젝트의 거의 모든 강연에서 나온 계층구조 설계의 거의 모든 문제점들이 발생하고 있는 상황이었습니다 .
게임 오브젝트여
당신은 누구시길래 ..
오브젝트
캐릭터
지형
프랍
트리거
광원
카메라
발사체
레벨
게임 오브젝트란 ?
• 플레이어 , 몬스터 등 캐릭터• 캐릭터가 서있는 지형• 바위 , 나무 , 건물 등 배경 오브젝트• 함정 , 회복아이템 등 트리거• 미사일 , 수류탄 , 파편 등• 카메라 , 광원 등
오브젝트
오브젝트
오브젝트
오브젝트
캐릭터
지형
프랍
트리거
광원
카메라
발사체
레벨
상호작용
게임 오브젝트란 ?
게임 = 게임 오브젝트 사이의 상호작용
행동 기반 게임오브젝트란 ?
게임 오브젝트 설계의 중요성
행동 기반 게임오브젝트의 개념
컴포넌트 기반 게임오브젝트
행동 기반 게임오브젝트
행동 기반 게임오브젝트의 개념
새로운 프로젝트 시작 !방을 만들고 들어가서 다른 유저들과 몬스터를 잡고 노는 MO Action RPG 를 만들게 되었습니다 . 총도 쏘고 칼도 휘두르고 물약도 먹고 같이 공격해주거나 회복시켜주는 기계도 소환하고 ..
때가 왔다 !
엑셀은 밟을 수 없어도 핸들만은 놓치지 않겠어 !
그래서 게임오브젝트를 ..
엑셀은 밟을 수 없어도 핸들만은 놓치지 않겠어 !
사람을 보고 만들었습니다
조종
모델
데이터
행동
사람 비슷한 것도 ..
조종
모델
데이터
행동
사람 안 비슷한 것도 ..
조종
모델
데이터
행동
조종모델
데이터
행동
당시 사용했던 구조컨트롤러에서 게임오브젝트에 명령을 주고 , 게임오브젝트가 명령을 받으면 액션을 실행합니다 . 액션은 모델과 데이터 , 게임오브젝트 ( 위치 , 회전 등 ) 를 조작합니다 .
오브젝트
컨트롤러
액션모델 /데이터
오브젝트
컨트롤러
액션모델 /데이터
조건 검사
오브젝트
컨트롤러
액션모델 /데이터
조건 검사
액션 명령
오브젝트
컨트롤러
액션모델 /데이터
조건 검사
액션 명령
다른오브젝트
액션 명령
오브젝트
컨트롤러
액션모델 /데이터
조건 검사
액션 명령
명령에 맞는 액션 실행
다른오브젝트
액션 명령
오브젝트
컨트롤러
액션모델 /데이터
조건 검사
액션 명령
명령에 맞는 액션 실행
데이터 업데이트/ 기능 수행
다른오브젝트
액션 명령
오브젝트
엑티브액터
오브젝트
엑티브액터
액션 명령
오브젝트
엑티브액터
액션 명령
때리다서다 달리다 죽다맞다
명령에 연결된 액션
오브젝트
엑티브액터
액션 명령
때리다서다 달리다 죽다맞다
명령에 연결된 액션
그래서 게임 오브젝트의 구성은 ..
UserInputControl RemoteControl
플레이어 캐릭터플레이어 캐릭터는 유저의 컨트롤 ( 실제 입력 , 네트워크 ) 과 시나리오의 흐름에 영향을 받고 , 검과 총 두 가지의 무기를 사용하여 몬스터를 사냥합니다 . 따라서 무기를 체인지하면 행동패턴이 달라집니다 .
ScenarioControl
Local 인 경우 Remote 인 경우
검 Actor 총 Actor
활성화
UserInputControl RemoteControl
플레이어 캐릭터플레이어 캐릭터는 유저의 컨트롤 ( 실제 입력 , 네트워크 ) 과 시나리오의 흐름에 영향을 받고 , 검과 총 두 가지의 무기를 사용하여 몬스터를 사냥합니다 . 따라서 무기를 체인지하면 행동패턴이 달라집니다 .
ScenarioControl
Local 인 경우 Remote 인 경우
검 Actor 총 Actor
활성화
회의 중
좀비는 왜 느린게
컨셉이지 ? 무섭지 않자나 !
그래도 좀비는 걸어서
다가오는게 매력이 있다구 !
회의 중
그럼 뛰어다니게
만들면 되지 ! 그런 좀비영화
많자나 !
그럼 처음엔 걷다가 특정
조건이 만족되면 뛰자 !
Actor
공격 이동
좀비 몬스터처음에는 느리게 걸어 다니면서 몽둥이를 휘두르지만 , 데미지를 받아 HP 가 30% 이하가 되고 특정 조건이 만족되면 다리가 떨어지면서 팔로 엄청 빠르게 이동을 하고 점프를 하여 입으로 물어뜯는 공격을 합니다 .
AIControl
데이터 1 데이터 2 Model1Model2
몬스터기본이동몬스터기본공격
변신 전
Actor
공격 이동
좀비 몬스터처음에는 느리게 걸어 다니면서 몽둥이를 휘두르지만 , 데미지를 받아 HP 가 30% 이하가 되고 특정 조건이 만족되면 다리가 떨어지면서 팔로 엄청 빠르게 이동을 하고 점프를 하여 입으로 물어뜯는 공격을 합니다 .
AIControl
데이터 1 데이터 2 Model1Model2
변신 후
좀비물어뜯기공격
좀비상체이동
하지만 저는 이때 ..
컴포넌트가 뭔지 몰랐습니다 ..
바깥세상은어떤 곳일
까 ..
컴포넌트 기반으로게임오브젝트를 만들면 좋데 !
오후 4 시 30 분에 여기에서 발표합니다 . 많이 참석해주세요 !!
컴포넌트 ?!
하지만 이미 프로젝트는 마무리 단계 ..
행동 기반 게임오브젝트란 ?
게임 오브젝트 설계의 중요성
행동 기반 게임오브젝트의 개념
컴포넌트 기반 게임오브젝트
행동 기반 게임오브젝트
컴포넌트 기반 게임오브젝트
다시 새로운 프로젝트 시작 !원작의 유명 대전 격투 게임을 RPG 로 재탄생 시킨 사무라이쇼다운 온라인은 Full 3D 타입의 쾌적하고 전략성 있는 전투를 추구하며 원작의 방대한 세계관을 그대로 즐길 수 있는 게임입니다 .
지금이다 !!
컴포넌트 ! 나도 이 녀석으로 게임오브젝트를 만들어보자 !
오브젝트
ModelComponent
AIComponent
HealthComponent
TargetableComponent
PhysicsComponentMoveableComponent
MotionTreeComponent
TouchComponent
컴포넌트 기반 게임 오브젝트의 형태게임 오브젝트는 기본적인 데이터만을 가지고 있고 , 모든 데이터와 기능은 컴포넌트로 만들어서 게임오브젝트에 붙이는 형태입니다 . 오브젝트의 형태별로 필요한 기능만을 가질 수 있도록 설계된 방식입니다 .
하지만 역시 쓰던 것이 편하나 봅니다 ...
• 컴포넌트가 다른 컴포넌트를 참조하고 수정하는 경우
잘 알진 못하지만 ..
저는 이런 부분들이 불편했어요
• 하나의 일을 여러 컴포넌트가 복잡적으로 처리해야 하는 경우
• 사실 이렇게 페이지를 하나 쓸 만큼 나쁜 점이 많지 않아요 ..
그래서 합쳤습니다 ..
행동 기반 게임오브젝트란 ?
게임 오브젝트 설계의 중요성
행동 기반 게임오브젝트의 개념
컴포넌트 기반 게임오브젝트
행동 기반 게임오브젝트
행동 기반 게임오브젝트
배경 투명으로 어떻게 만드나요 ..
오브젝트에 액션 명령
오브젝트가 가지고 있는기본적인 기능 / 데이터들
오브젝트가 명령에 따라 취해야 하는 액션
배경 투명으로 어떻게 만드나요 ..
오브젝트에 액션 명령
오브젝트가 가지고 있는기본적인 기능 / 데이터들
오브젝트가 명령에 따라 취해야 하는 액션
컨트롤러
컴포넌트
액션
오브젝트
UserInputController
AIController RemoteController
MoveDataComponent
ModelComponent HealthComponent
TargetableComponent
Idle
Move
ActionTable
Attack Touch
Struck
Drop
컨트롤러
컴포넌트
액션
오브젝트
컨트롤러
액션컴포넌트
오브젝트
컨트롤러
액션컴포넌트
조건 검사
오브젝트
컨트롤러
액션컴포넌트
조건 검사
액션 명령
오브젝트
컨트롤러
액션컴포넌트
조건 검사
액션 명령
다른오브젝트
액션 명령
오브젝트
컨트롤러
액션컴포넌트
조건 검사
액션 명령
명령에 맞는 액션 실행
다른오브젝트
액션 명령
오브젝트
컨트롤러
액션컴포넌트
조건 검사
액션 명령
명령에 맞는 액션 실행
데이터 업데이트/ 기능 수행
다른오브젝트
액션 명령
행동 기반 게임오브젝트 구조컨트롤러에서 게임오브젝트에 명령을 주고 , 게임오브젝트가 명령을 받으면 액션을 실행합니다 . 액션은 컴포넌트 , 게임오브젝트 ( 위치 , 회전 등 ) 를 조작합니다 .
간단히 표현해보면 ..
• 독립적인 하나의 기능
• 어떠한 일을 하기 위해 쓰이는 데이터
• 여러 게임 오브젝트에 붙어 각각의 고유한 기능을 수행
• 다른 컴포넌트나 게임오브젝트를 수정하지 않음
컴포넌트
컴포넌트
공통
클라이언트
서버
컴포넌트 베이스
• 게임 오브젝트에 액션 명령
• 활성화 / 비활성화가 가능
• 컴포넌트나 게임오브젝트를 수정하지 않음
• 게임 오브젝트 자체에서 발생되는 액션을 명령
컨트롤러
컨트롤러
공통
클라이언트
서버 컨트롤러 베이스
• 게임오브젝트가 해야 하는 어떠한 일
• 컴포넌트나 게임오브젝트를 실제로 수정함
• 액션 명령을 받으면 명령에 연결된 액션을 실행
• 게임오브젝트는 한번에 여러 개의 액션 실행 가능
액션
액션
공통
클라이언트
서버액션 베이스
• 액션을 실행시키기 위한 명령
• 게임오브젝트는 액션 명령을 받고 연결된 액션을 실행
• 액션을 실행하는데 사용되는 데이터는 명령에 따라 달라짐
• 액션 명령은 ActionBase 를 직접 상속받은 객체의 RTTI를 이용
액션 명령
편의를 위해 매크로를 사용
액션 명령 선언
ActionBase 직접 상속
액션 명령 정의
ActionBase 직접 상속 X
액션 명령 ID
데이터
매크로의 형태
RTTI 를 사용
ActionBase 직접 상속만 허용
• 게임 오브젝트가 할 수 있는 액션들의 모음
• 액션 명령에 액션을 연결하여 저장
• 게임 오브젝트는 여러 개의 액션 테이블을 가짐
• 액션 테이블에는 레벨이 존재하여 활성화된 액션 테이블 중 레벨이 높은 것부터 액션 명령을 검사
액션 테이블
액션 연결
액션 테이블의 형태
활성화 / 비활성화
레벨이 높은 액션 테이블부터 실행할 액션 검사
• 게임오브젝트는 액션 레이어를 통해 액션을 실행
• 액션의 시작부터 끝까지를 관리
• 레이어 개념으로 액션을 실행하여 한번에 여러 개의 액션을 실행시킴
액션 레이어
액션 레이어의 형태
액션 실행
액션을 실행시킬 레이어
게임 오브젝트 구성 예시
플레이어 캐릭터의 이동을 간단하게 만들어 봅시다
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle
오브젝트
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle
입력 X 실행 중 액션 XIdle 명령
오브젝트
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle
입력 X 실행 중 액션 XIdle 명령
Idle 명령에 연결된 액션 검색
오브젝트
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle
입력 X 실행 중 액션 XIdle 명령
CharacterIdle 실행
Idle 명령에 연결된 액션 검색
오브젝트
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle
입력 X 실행 중 액션 XIdle 명령
Idle 애니메이션 재생
CharacterIdle 실행
CharacterIdle
Idle 명령에 연결된 액션 검색
오브젝트
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle CharacterIdle
오브젝트
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle CharacterIdle
MoveToPosition - CharacterMoveToPosition
MoveDataComponent
오브젝트
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle CharacterIdle
MoveToPosition - CharacterMoveToPosition
MoveDataComponent
오브젝트
이동할 위치 클릭MoveToPosition 명령
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle CharacterIdle
MoveToPosition - CharacterMoveToPosition
MoveDataComponent
오브젝트
이동할 위치 클릭MoveToPosition 명령
MoveToPosition 명령에연결된 액션 검색
CharacterMoveToPosition실행
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle CharacterIdle
MoveToPosition - CharacterMoveToPosition
MoveDataComponent
오브젝트
이동할 위치 클릭MoveToPosition 명령
MoveToPosition 명령에연결된 액션 검색
CharacterMoveToPosition실행
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle CharacterIdle
MoveToPosition - CharacterMoveToPosition
MoveDataComponent
오브젝트
이동할 위치 클릭MoveToPosition 명령
MoveToPosition 명령에연결된 액션 검색
CharacterMoveToPosition
CharacterMoveToPosition실행
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle
MoveToPosition - CharacterMoveToPosition
MoveDataComponent
오브젝트
이동할 위치 클릭MoveToPosition 명령
MoveToPosition 명령에연결된 액션 검색
CharacterMoveToPosition
CharacterMoveToPosition실행
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle
MoveToPosition - CharacterMoveToPosition
MoveDataComponent
오브젝트
이동할 위치 클릭MoveToPosition 명령
MoveToPosition 명령에연결된 액션 검색
CharacterMoveToPosition
이동속도참조
위치 값 설정
UserInputController
ModelComponent
ActionLayerActionTable
Idle - CharacterIdle
MoveToPosition - CharacterMoveToPosition
MoveDataComponent
오브젝트
어쨌든 ..
게임오브젝트 구성을 쉽게 !!
Q&A