posted by 나무꾼! 2014. 12. 12. 11:32

캐릭터 컨트롤러Character Controller

캐릭터 컨트롤러는 게임 환경 내에서 캐릭터의 위치를 제어하고 다른 사물이나 캐릭터와의 상호작용을 쉽게 제어할 수 있도록 제공되는 기능이다. 캐릭터 컨트롤러를 활용 하면 다양한 게임의 장르에 따라 다르게 구현되어야 하는 다양한 캐릭터의 움직임을 쉽게 표현 해낼 수 있다. 캐릭터 컨트롤러를 이용해서 구현할 수 있는 캐릭터의 행동들을 예를 들면 다음과 같다.

  • 물리가 적용된 강체 또는 다른 캐릭터 와의 상호작용
  • 사용자의 입력에 의해 지면에 밀착한 채 지정된 속도와 방향으로 제어
  • 점프의 높낮이를 동적으로 컨트롤
  • 중력에 의한 캐릭터의 추락 속도 제어
  • 사다리나 그물망을 타고 오르기
  • 이동이 가능하도록 지정된 각도 이내에서 경사면이나 계단 오르기
  • 좁은 문을 통과 할 때 캐릭터의 두께나 높이에 의한 충돌 처리
  • 일시적으로 자세를 낮추어 높이가 낮은 터널을 이동

물론 물리 엔진의 도움 없이 이런한 기능들을 직접 구현할 수도 있겠지만 게임에 적합한 캐릭터의 움직임을 표현해내고 완성도를 높이는데 까지는 많은 시간과 노력이 필요하다. 하복 물리 엔진에서 제공되는 캐릭터 컨트롤러는 다양한 장르에서 범용적으로 적용이 가능하고 성능이나 퀄리티 측면에서도 완성도가 높은 기반 프레임워크로 사용자가 원하는 형태로 기능 확장이나 수정하기에 용이하다. 그 주요 특징을 요약하면 다음과 같다.

  • 물리가 적용된 동적인 환경에서의 캐릭터 컨트롤이 가능하다.
  • 1인칭 시점 / 3인칭 시점의 캐릭터, 플레이어 와 NPC 에서 범용적으로 활용 가능
  • 실내 지형, 실외 지형, 움직이는 지형 등의 다양한 3D 환경에 범용적으로 적용이 가능
  • 쉽게 확장 및 교체 가능한 프레임워크로 활용이 가능하므로 게임의 특징에 맞게 커스터마이징 할 수 있다. 예를 들어 2단 점프, 날아가기, 절벽 등반 등의 개성 있는 캐릭터를 직접 만들 수 있다
  • 실시간 전략 시뮬레이션 게임이나 MMORPG 게임 동시에 처리해야 하는 캐릭터의 수가 많은 게임 에서도 무리 없이 사용이 가능하도록 최적화 되어있다.

일반적으로 캐릭터 컨트롤러의 충돌 처리를 위해 캐릭터를 감싸는 물리적인 형태로 캡슐을 주로 사용하게 되는데, 그 이유는 아래와 같다.

  • 코너에서 회전을 하더라도 걸리는 부분이 없기 때문에 지형에 갇히게 될 가능성이 적다.
  • 캡슐은 충돌 처리시 간단한 연산만으로 처리가 가능하기 때문에 성능 면에서 유리하다.
  • 다양한 두께와 키를 가진 캐릭터를 쉽게 표현할 수 있다.

Note : vForge 툴 에서는 캡슐 형태의 캐릭터 컨트롤러만 적용할 수 있지만 실제 런타임 코드를 통해서는 다른 물리적 형태를 사용할 수 도 있다. 말이나 용과 같이 인간형이 아닌 캐릭터에서 사용될 경우 캡슐 형태로 표현 하기에는 한계가 있다. 이 경우 캡슐이 아닌 다른 형태를 사용하기 위해서는 어느 정도의 코드 수정은 필요하다.

 

1. 캐릭터 컨트롤러 컴포넌트 속성

프로젝트 아나키 에서는 vForge 툴 에서 하복 물리 엔진의 캐릭터 컨트롤러 기능에 쉽게 접근할 수 있도록 캐릭터 컨트롤러 컴포넌트를 기본 제공하고 있다. 캐릭터 컨트롤러 컴포넌트를 엔티티에 추가 하고 컴포넌트의 속성들을 조절 하면 자신의 게임 디자인에 어울리는 캐릭터의 특징을 쉽게 설정하고 디버깅 할 수 있다.

  • Component ID: 컴포넌트를 식별하기 위한 ID
  • Enabled: 컴포넌트를 활성화 또는 비활성화 할 수 있다.
  • Debug : True 로 설정하면 캐릭터는 감싸는 캡슐의 물리적인 형태를 화면에서 확인할 수 있다
  • Debug Color : 디버그를 True로 지정했을 경우 캡슐의 색상을 지정할 수 있다
  • Character Top : 캐릭터의 키에 해당되는 값으로, 캐릭터를 감싸는 캡슐의 높이를 변경할 수 있다
  • Character Bottom: 캐릭터가 서있는 바닥 면의 위치를 나타내는 값으로 캡슐의 바닥 위치를 변경할 수 있다.
  • Capsule Radius: 캐릭터의 두께를 나타내는 값으로, 캡슐의 반경을 조절할 수 있다
  • `
  • Max Slope : 캐릭터가 걸어서 올라갈 수 있는 최대 경사각 을 지정할 수 있다 최대값은 90도 이다
  • Step_Height: 올라갈 수 있는 계단 한칸 의 높이 를 설정할 수 있다. Vision에서 설정한 Unit 단위로 입력된다.
  • Step_Threshold: 인식 가능한 계단의 최소 경사 각도를 설정할 수 있다.
  • Jump_Height: 캐릭터의 점프 높이를 미터 단위로 설정 할 수 있다.

  • Character Mass: 캐릭터의 질량을 설정할 수 있다.
  • Character Strength: 캐릭터가 이동하면서 부딪힌 다른 물리 강체가 영향 받게 되는 힘의 최대값을 나타낸다
  • Static Friction: Default Static Friction for surfaces hit.
  • Dynamic Friction : 이 값을 통해 캐릭터가 장애물과 충돌한 상태에서 속도가 얼마나 줄어들게 될지를 설정할 수 있다. 이 값을 1 로 지정하게 되면 캐릭터가 벽에 닿은 채로 이동할 때 입력 방향과 벽 사이의 각도에 따라 이동 속도가 줄어들게 된다. (보통 FPS 게임과 같이 벽면 타고 슬라이딩 하는 경우에 주로 사용된다.) 이 값을 0 으로 지정하고 벽에 닿은 채로 이동할 경우 방향은 보정되지만 속도에는 변화가 없다.

    그림. [출처 : Havok Physics 매뉴얼]

        

Dynamic Friction 이 1인 경우                                         Dynamic Friction 이 0인 경우

  • Gravity_Scale : 중력의 세기를 조절할 수 있다. 0.0 으로 설정하면 중력이 없게 되고, 1.0 으로 설정하면 물리 월드에서 지정된 기본 중력값이 그데로 적용 된다.
  • Max_Velocity : 다른 물리 오브젝트와 충돌시 과도한 리액션을 방지 하기 위해 최대 속력을 제한하기 위한 속성 이다
  • Max_Acceleration : 최대 가속도 값을 제한하기 위한 속성으로 좀 더 안정적인 캐릭터 움직임을 위해 사용 된다
  • PenetrationRecoverySpeed : 캐릭터가 물리 환경과 부딪치면서 파묻힌 경우 밀려나오는 속도를 조절할 수 있다.


2. 캐릭터 컨트롤러를 사용해서 캐릭터 제어해보기

프로젝트 아나키 에서는 두 종류의 캐릭터 애니메이션 시스템을 제공하고 있다.

Vision 엔진에서 기본적으로 내장되어 제공되는 Vision 애니메이션 시스템 과 별도의 미들웨어 제품으로 개발되어 프로젝트 아나키에 통합 제공되는 Havok Animation Studio 가 있다. 여기에 대한 자세한 설명은 캐릭터 애니메이션 장에서 다시 설명하도록 하겠다.

Vision 애니메이션 기반으로 제작된 캐릭터는 기본 제공되는 컴포넌트를 통해 캐릭터의 이동을 키보드로 제어해 볼 수 있다. 아래 순서 데로 캐릭터 컨트롤러를 적용해 보도록 하자

  • Village 샘플 프로젝트를 vForge로 연다
  • Village 샘플 프로젝트는 시작 > "Village" 를 검색해서 바로 가기를 찾을 수 있다. 아니면 Anarchy SDK 설치 경로 에서 프로젝트 파일을 찾아서 직접 여는 방법도 있다.
  • Data\Vision\Samples\Engine\Map\Village\ VillageMap.project
  • 새로운 Scene 을 만들고 캐릭터가 이동하기 위한 바닥 면 과 건물을 배치한다

  • Vision Animation 으로 제작된 캐릭터인 Human Archer 를 장면에 배치한다

  • Human Archer 캐릭터에 Havok Character Controller 컴포넌트 추가 하고, Debug 플래그를 켠 후, Run in Editor 모드에서 캐릭터가 바닥 위에 밀착되어 있는지, 캐릭터의 키 와 두께에 맞는지 확인 하면서 설정 값을 조절한다.

  • 기본적인 캐릭터 이동과 애니메이션 전환을 간단히 테스트 해보기 위해 Transition State Machine 컴포넌트 와 Playable Character Component 컴포넌트를 추가 한다.

  • 대상 엔티티를 중심으로 궤도를 돌면서 따라다닐 수 있고, 마우스로 각도 및 거리의 제어가 가능한 카메라인 Orbit Camera 컴포넌트를 추가 한다
  • 설정이 완료 되었다면 Play the game 모드로 장면을 실행하고 WASD 키와 Shift 키를 사용해 캐릭터를 조작해 보자.
  • 캐릭터 컨트롤러Character Controller의 Step Height 설정값을 변경하면서 계단을 이동해 보고 마찰력Friction 값을 변경하면서 벽면에 밀착한채 이동을 해보도록 하자. 다른 캐릭터를 추가하거나 물리가 적용된 공을 장면에 배치하고 물리적인 상호작용을 테스트할 수도 있다.