블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2731)
Unity3D (814)
Programming (474)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (57)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (51)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
03-28 00:02

캐릭터 컨트롤 하기

Unity3D / 2012. 11. 3. 20:08

캐릭터 컨트롤

 

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 로 방향이 천천히 바뀌도록

구성한다.

 

 




반응형

'Unity3D' 카테고리의 다른 글

Smooth Follow Camera  (0) 2012.11.06
Timer()함수를 대신하는 Invoke()함수  (0) 2012.11.05
빌보드 관련  (0) 2012.11.02
Unity3D로 만드는 초간단 2D 게임 (1)  (0) 2012.11.02
런타임 중 프리팹을 인스턴스화 하기  (0) 2012.10.30
Posted by blueasa
, |