본문 바로가기

프로그래밍/Unity

캐릭터 컨트롤 하기

캐릭터 컨트롤

   

unity3d 에서 Update() 시 키입력 처리를 통해 캐릭터를 이동할 수 있다.

각 키를 맵핑하고, 해당 이동 처리를 하고, 충돌 영역등을 설정해야 한다.

하늘에 떠있는 오브젝트는 키 입력에 따라 Translate를 해주면 되는데,

캐릭터의 경우 중력도 적용해야 하고, 이동 속도도 제어해야 한다.

   

이것저것 처리할게 많아지는데, unity3d 에서는 이와 관련한 컴포넌트를 제공하고 있다.

   

1. 캐릭터로 사용할 오브젝트(GameObject)를 하나 만든다.

큐브 오브젝트를 추가하고, 이름을 Player로 변경했다.

   

2. 라이트 추가

카메라 위치에 Directional light 오브젝트를 추가.

   

3. 스크립트 추가

Component > Physics > Character Controller 추가하고, 스크립트 작성후

컨트롤러와 스크립트를 Player 객체에 적용하게 되는데, 여기서는 스크립트만 작성 후

자동으로 컨트롤러가 추가되도록 구성해본다.

   

Project 에 Scripts 폴더를 하나 만들고, c# 스크립트를 추가.

   

   

스크립트 파일명을 PlayerController로 변경해줬다. 스크립트의 클래스명도 해당 파일명으로

변경해 주어야 한다.

   

   

   

4. 스크립트 작성

이 스크립트가 실행되려면 필요한 요소를 지정한다.

[RequireComponent(typeof(CharacterController))]

   

이 스크립트를 Player 객체에 드래그하여 붙인다.

Player의 인스펙터를 보면 Character Controller와 Player Controller(Script)가 추가된것을

확인할 수 있다.

   

이제 Player 객체를 움직여 보자.

  CharacterController controller = (CharacterController)GetComponent( typeof(CharacterController) );

  controller.transform.Translate( Input.GetAxis("Horizontal"), 

                                             0, 

                                             Input.GetAxis("Vertical"));

   

컨트롤러를 이동하면 Player 객체도 이동하게 된다.

이 내용은 컨트롤러를 사용하지 않고, Player를 직접 Translate해도 동일하다.

이러한 이동은 캐릭터가 어디를 앞으로 하고 있는지 고려치 않은 이동이다.

게임상의 캐릭터는 이동시 방향정보를 가지고 있어야 한다.

   

   

다시, 이번엔 캐릭터가 서 있을 공간을 하나 만들자

바닥으로 사용할 큐브 오브젝트를 하나 추가하고, 캐릭터 아래에 배치했다.

   

   

다시 스크립트 수정

변수 선언

 public float playerSpeed;

 private Vector3 moveDirection = Vector3.zero;

 private float gravity = 20.0f;

 private float jumpHight = 10.0f;

   

 private float verticalSpeed = 0.0f;

 private float moveSpeed = 0.0f;

   

   

몇가지가 변경되었다.

일단, 중력을 위한 변수와 캐릭터의 방향을 위한 변수. 캐릭터의 스피드를 위한

변수가 추가되었다.

   

실행시켜보면 하늘에 있던 캐릭터가 중력의 적용을 받아 아래로 떨어지고,

바닥에서 이동이 이루어지게 된다.

   

방향은 키입력에 따라 변경되고, Player의 방향을 설정한 뒤, 컨트롤러의 Move 메쏘드를 통해 이동하게 된다.

   

점프액션을 추가.

   

   

   

간단하게 점프가 추가되었다.

   

   

5. 카메라 기반 위치보정

이제 캐릭터의 이동은 대충 구성되었다. 하지만, 카메라 위치와 관련없이 움직이기때문에

카메라가 반대로 있을경우 키입력도 반대가 되어야 한다. 방향벡터를 결정할때 카메라의

벡터를 곱해 보정을 해야한다.

   

카메라의 전면, 우측 벡터를 사용해 targetDirection을 보정했다.

이제 카메라가 어디 있건 동일한 키로 움직이게 된다.

   

   

   

6. 방향에 따른 이동

비록 큐브이지만 전방을 향한곳이 앞쪽이라고 할 수 있다. 현재는 방향만 바뀔 뿐이지

큐브는 회전하지 않으므로 실제 앞면이 보이지는 않는다.

단순 이동시에는 상관없으나 캐릭터의 경우 해당 방향으로 앞면이 보여져야 한다.

Player를 현재 방향에 맞게 회전시켜보자.

추가적으로 회전할때 부드럽게 회전하도록 Vector3.Lerp 로 방향이 천천히 바뀌도록

구성한다.

   

   

   


'프로그래밍 > Unity' 카테고리의 다른 글

[Unity] 인스펙터에 UI 추가하기  (0) 2011.06.15
2D를 위한 Plane 생성  (0) 2011.05.30
Physics.Raycast  (0) 2011.05.13
2D 게임을 위한 몇가지  (0) 2011.05.09
터치 입력  (0) 2011.04.04
스크립트에서 오브젝트/컴포넌트 접근 및 활성화  (0) 2011.02.11
강체-RigidBody 기본속성  (0) 2011.02.03
[Unity3D] 오브젝트 회전 - Quaternion  (0) 2011.02.01
FBX 에니메이션 임포트  (0) 2011.01.27
기본 클래스 정리  (0) 2011.01.17