본문 바로가기

지식창고/Unity엔진

Unity5 Mecanim Animation Tutorial - Part7

반응형

Part7. 키보드 W,S키의 입력을 받아 캐릭터의 이동. 

 

S키를 입력 받았을 때는 캐릭터가 뒷걸음질 치며 이동하는 것이 아닌 캐릭터가 후방으로 180도 회전하며 반대 방향을 향해 이동할 수 있도록 할 생각입니다.

 

[그림 3]

지난 튜토리얼을 따라하시면서 생성했던 Project를 열어주도록 하겠습니다.

 

저는 지난 튜토리얼 때 mmdImportTutorial이라는 프로젝트 명으로 생성하여 작업을 하였기 때문에 mmdImportTutorial라는 프로젝트를 열어주도록 하겠습니다.

 

혹시, 다른 Project 명으로 하셨다면 해당 프로젝트를 열어주시기 바랍니다.

 

먼저, 진행에 앞서 지난 튜토리얼에 작성하였던 DanceController 스크립트를 열어 소스를 수정해 주도록 하겠습니다.

(그림 4-1 ~ 4-3)

 

[그림 4-1]

 

[그림 4-2]

 

[그림 4-3]

그림 4-3과 같이 소스를 변경하여 주시고 저장하여 주시기 바랍니다.

 

이제 여러분께서 사용하실 걷기 애니메이션 파일과 달리기 애니메이션 파일 각각의 파일을 원본이 아닌 복사본을 만들어 이름을 변경하여 사용하도록 하겠습니다.(그림 5-1, 5-2)

(※복사본 생성 방법 : 해당 파일 클릭 -> Ctrl+D)

 

[그림 5-1]

 

[그림 5-2]

복사본을 생성하여 이름까지 변경하여 주셨다면, 01. Animation폴더로 복사된 2개의 애니메이션파일(걷기, 달리기)을 드래그 앤 드랍하여 이동시켜 주도록 하겠습니다.(그림 6-1)

 

[그림 6-1]

01. Aniamtion 폴더를 클릭하여 보시면 2개의 애니메이션 파일이 제대로 이동되었다면, 해당 폴더 안에 2개의 애니메이션 파일이 추가가 되어 있어야 합니다.(그림 6-2)

 

만약 없다면 다시 기존 복사본파일이 있는 곳에서 01. Animation 폴더로 이동시켜주시기 바랍니다.

(이렇게 폴더별로 관리해주는 이유는 크게 없으며, 단지 각 폴더를 누가 보아도 어떠한 리소스 파일들을 가지고 있는 폴더들인지 알아차리기 쉽게 구분하기 위함입니다.

저 또한 혼자 작업하더라도 항상 폴더별로 리소스 파일들을 관리하고 있습니다.)

 

[그림 6-2]

이렇게 이동시킨 2개의 애니메이션 파일들을 각각 클릭하여 Inspector 탭에서 Loop Time와 Loop Pose를 체크하여 해당 애니메이션을 반복적으로 재생시켜줄 수 있도록 하겠습니다.

(그림 6-3, 6-4) 

 

[그림 6-3]

 

[그림 6-4]

지난 튜토리얼에서도 애니메이션 파일의 옵션들 중에 Loop Time과 Loop Pose에 대하여서만 말씀을 드렸습니다.

 

다른 옵션들에 대하여서도 설명을 드린 후 진행하도록 하겠습니다.

 

[그림 6-5]

 

 Root Transform Rotation

 Bake Into Pose를 체크하게 되면, 해당 애니메이션 파일을 지닌 오브젝트가 해당 애니메이션을 구동 시킬 때 바라보는 방향의 설정이 가능.

 Based Upon은 애니메이션파일의 원본 설정을 사용할 것인지(Original) 유니티에 맞춰 사용할 것인지(Body Orientation)를 설정이 가능.

 Offset 수치 변경을 통한 세밀한 변경이 가능.

 Root Transform Position(Y)

 Bake Into Pose를 체크하게 되면, 해당 애니메이션 파일을 지닌 오브젝트가 해당 애니메이션을 구동 시킬 때 Y축(높이)위치 값의 설정이 가능.

 Based Upon은 애니메이션파일의 원본 설정을 사용할 것인지(Original) 유니티에 맞춰 사용할 것인지(Body Orientation)를 설정이 가능.

 Offset 수치 변경을 통한 세밀한 변경이 가능.

 Root Transform Position(XZ)

 Bake Into Pose를 체크하게 되면, 해당 애니메이션 파일을 지닌 오브젝트가 해당 애니메이션을 구동 시킬 때 중심축의 설정이 가능.

 Based Upon은 애니메이션파일의 원본 설정을 사용할 것인지(Original) 유니티에 맞춰 사용할 것인지(Body Orientation)를 설정이 가능.

 해당 옵션은 Offset이 없음. 

 Mirror

 해당 옵션을 체크하게 되면, 원본 애니메이션 파일이 바라보는 정 반대 방향으로 애니메이션을 구동 시킬 수 있음.

[표1 - Animation 파일의 설정 항목들]

 

해당 옵션들을 통하여 사용하고자 하는 애니메이션 파일이 구동되어질 때 바라보는 방향, 높이, 중심축 등을 설정하여 줄 수 있습니다.

 

어떤식으로 되는 것인지 보여드리기 위해 설정을 바꿔 테스트한 화면의 캡쳐를 첨부하도록 하겠습니다.

 

Root Transform Rotation 부분을 체크하여 Original로 변경하여 W키를 눌러본 모습입니다.

(Animation 설정 항목 예제 그림 1-1, 1-2)

 

[ Animation 설정 항목 예제 그림 1-1]

 

[ Animation 설정 항목 예제 그림 1-2]

이번에는 Root Transform Position(Y) 부분을 체크하여 Offset 수치를 변경하여 W키를 눌러본 모습입니다.(Animation 설정 항목 예제 그림 1-3, 1-4)

 

[ Animation 설정 항목 예제 그림 1-3]

 

[ Animation 설정 항목 예제 그림 1-4]

이렇게 사용하고자 하는 애니메이션 파일의 방향, 높이 등을 설정하여 여러분이 원하는 방향과 높이대로 설정하여 사용할 수 있도록 해주는 옵션입니다. 

 

걷기 애니메이션 하나를 먼저 구현시켜보도록 하겠습니다.

 

걷기 애니메이션 파일을 Animation 탭으로 드래그 앤 드랍하여 추가하여 주시기 바랍니다.

(그림 7-1, 그림 7-2)

 

[그림 7-1]

 

[그림 7-2]

노드 간의 Transition을 연결하여 작동 시켜주기 전에 새로운 스크립트를 하나 새롭게 생성하도록 하겠습니다.(그림 8-1)

(※스크립트 생성 방법 : Assets에서 우클릭 -> Create -> C# Script 클릭)

 

[그림 8-1]

이렇게 생성된 스크립트의 이름을 moveController로 변경하여 주도록 하겠습니다.(그림 8-2)

(제 튜토리얼을 그대로 따라하시겠다면 동일한 이름으로 작성하여 주시면 되겠으며, 작업하시는 본인이 편한 이름으로 변경하신 다음 따라하셔도 무관한 부분입니다.) 

 

[그림 8-2]

임시적으로 바닥으로 사용할 Plane 오브젝트를 하나 추가하여 주도록 하겠습니다.

(※Plane추가 방법 : Hierarchy탭에서 우클릭 -> 3D Object -> Plane클릭)(그림 9-1)

 

[그림9-1]

이렇게 바닥을 추가해주는 이유는 캐릭터를 키입력으로 이동시키게 되면, 한 없이 Y축의 - 방향을 향해 내려가는 현상이 나오기 때문에 임시적으로 사용하여 줄 바닥을 추가해주는 것입니다.

 

새롭게 추가된 Plane 오브젝트는 Scene 뷰에서 보시면 캐릭터의 허리 높이 위치하여 생성되어지게 됩니다.(그림 9-2)

 

[그림 9-2]

현재 상태로 나두게 될 경우 캐릭터의 발끝에 충돌되어지는 오브젝트는 실질적으로 없기 때문에 마찬가지로 Y축의 - 방향으로 내려가게 됩니다.

 

그렇기에 Hierarchy탭에서 Plane오브젝트를 클릭해 둔 상태에서 Scene뷰를 통하여 확인해가며 적당한 위치로 Y축 화살표를 클릭하여 위치를 변경하여 이동시켜 주시면 되겠습니다.(그림 9-3)

 

[그림 9-3]

이제 캐릭터가 움직일 수 있도록 함과 동시에 캐릭터의 충돌체크를 하여 줄 수 있는 Character Controller라는 Component를 추가하여 주도록 하겠습니다.(그림 9-4)

(※새로운 Component 추가방법 : Hierarchy탭에서 MMD캐릭터 오브젝트 클릭 -> Inspector 탭에서 Add Component를 눌러 검색란에 char만 타이핑하여도 해당 Component가 검색되어짐)

 

[그림 9-4]

이렇게 Character Controller가 추가된 것을 Inspector탭에서 확인하실 수 있을 것입니다.(그림 9-5)

 

[그림 9-5]

하지만 해당 상태로 유니티에서 Play버튼을 누르게 되면 캐릭터가 바닥보다 위에 있는 상태(그림 9-6)를 확인 하실 수가 있을 것인데 그 이유가 캐릭터를 감싸고 있는 Character Controller의 콜리더(그림 9-7의 초록색 기둥)를 캐릭터에 맞춰 값을 변경해주지 않았기 때문인 것입니다.

 

[그림 9-6]

 

[그림 9-7]

 

캐릭터의 발이 바닥과 닿도록 하기 위해서는 Inspector탭에서 Character Controller의 Center, Radius, Height의 수치를 변경하여 주어야 합니다.

 

 Center

 Character Controller 콜리더의 중심을 변경하여 줄 수 있음(X, Y, Z)

 Radius

 Character Controller 콜리더의 폭을 변경하여 줄 수 있음

 Height

 Character Controller 콜리더의 높이(길이)를 변경하여 줄 수 있음

[표 1 - Character Controller의 주 3가지 항목]

 

이렇게 3개의 수치를 알맞게 조절하게 되면 조금전과는 다른 캐릭터를 딱 알맞게 감싸고 있는 Character Controller의 콜리더 모습을 Scene뷰에서 확인하실 수 있을 것입니다.(그림 9-8)

 

캐릭터마다 크기가 다르기 때문에 제가 첨부한 그림과 동일한 수치로 하면 맞지 않을 수 있습니다. 따라하시는 여러분께서 사용하시는 캐릭터에 맞춰서 3개 수치 값을 적당히 변경하시는 것을 추천드립니다.

 

 

[그림 9-8]

 

 

Character Controller를 알맞게 변경하신 다음에 조금전에 새롭게 생성하였던 moveController 스크립트를 Hierarchy탭의 MMD캐릭터 오브젝트로 드래그 앤 드랍하여 추가하여 주도록 하겠습니다.(그림 10-1, 10-2)

 

[그림 10-1]

 

[그림 10-2]

moveController 스크립트를 작성하기 전에 걷기 애니메이션 노드를 연결시켜 주도록 하겠습니다.

 

Animator 탭에서 Parameters 항목에서 + 모양을 눌러 Bool 변수를 새롭게 생성해주도록 하겠습니다.(그림 11-1)

 

[그림 11-1]

새롭게 생성된 Parameter형 Bool 변수의 이름은 Walk로 변경하도록 하겠습니다.(그림 11-2)

 

[그림 11-2]

지난 시간 튜토리얼을 따라해보셨던 분들이라면 각 노드간 어떻게 Transition으로 연결해주어야 하는지 아실테지만, 따라하셨어도 아직 익숙하지 않기에 방법을 잊으신 분들도 있을 것이라 생각되기 때문에 그림 첨부와 함께 설명드리도록 하겠습니다.

 

먼저 Idle노드에서 우클릭을 하여 Make Transition을 클릭하여 Walk_Audio노드로 연결시켜주시기 바랍니다.

(그림 12-1, 12-2) 

 

[그림 12-1]

 

[그림 12-2]

우리는 어느 때나 상관없이 W,S키가 입력되었을 시 걷기 애니메이션이 바로 구동되어지는 것을 구현할 것이기 때문에 Idle과 Walk_Audio노드를 연결하고 있는 Transition을 클릭하여

Inspector 탭에서 Has Exit Time을 해제하도록 하겠습니다.(그림 12-3)

(※Has Exit Time이란?

해당 애니메이션노드에서 Transition을 통하여 연결된 다른 노드로 이동 시켜 애니메이션을 구동시킬 때 기존에 구동시키던 애니메이션이 마지막까지 구동 시키고 나서 연결된 Transition을 통하여 연결되어 있는 다음 애니메이션 노드로 이동 시킬 것인지 아니면 바로 구동시키던 애니메이션을 종료하고 연결되어 있는 다음 애니메이션 노드로 바로 이동하여 해당 애니메이션을 구동 시킬 것인지를 설정하여 줄 수 있는 옵션)

 

[그림 12-3]

Walk_Audio노드에서 Exit노드를 연결하도록 하겠습니다.

Walk_Audio노드에서 우클릭을 하여 Make Transition을 클릭하여 주신 다음에 하얀색 연결선을 Exit노드로 마우스 포인트를 이동하여 클릭하여 주시면 되겠습니다.(그림 12-4, 12-5)

 

[그림 12-4]

 

[그림 12-5]

이렇게 Walk_Audio노드와 Exit노드를 연결하고 있는 Transition 또한 Has Exit Time을 해제하여 주도록 하겠습니다.

(그림 12-6)

 

[그림 12-6]

기본적인 노드간의 연결은 완료되었습니다.

 

이제 우리는 노드간 연결하고 있는 Transition에 조건을 추가하여 노드간에 이동이 되도록 해주겠습니다.

 

먼저, Idle노드와 Walk_Audio노드를 연결하고 있는 Transition을 클릭하여 Inspector탭에서

Conditions에서 '+'모양을 눌러 조건을 추가하여 Girls에서 Walk로 변경하도록 하겠습니다.

(그림 12-7, 12-8)

 

[그림 12-7]

 

[그림 12-8]

이번에는 Walk_Audio노드에서 Exit노드로 연결된 Transition을 클릭하여 마찬가지로, Conditions에서 조건을 추가하여 Girls에서 Walk로 변경하여 주시고 값을 false로 변경하도록 하겠습니다.(그림 12-9, 12-10, 12-11)

 

[그림 12-9]

 

[그림 12-10]

 

 

[그림 12-11]

각 애니메이션 노드간의 연결과 이동을 시켜줄 수 있는 조건에 대한 기본적인 설정이 끝났습니다.

 

이제 해당 Transition으로 연결된 노드 간의 조건 값을 변경하여 주어 이동시켜 애니메이션 파일이 구동될 수 있도록 코드를 작성하도록 하겠습니다.

 

moveController 스크립트를 열어 그림 13-1과 그림 13-2와 같이 작성하여주시기 바랍니다. 

 

[그림 13-1]

 

[그림 13-2]

그림 13-1과 13-2와 같이 코드를 작성하신 후 저장하신 다음에 유니티에서 Play버튼을 눌러보시면 Console 탭에서 Log가 제대로 찍히는 것을 확인 하실 수 있을 것입니다.

(그림 14-1, 14-2)

 

[그림 14-1]

 

[그림 14-2]

확인이 되셨다면 다시 moveController스크립트로 돌아와 그림15-1, 15-2와 같이 추가적으로 작성하시기 바랍니다.

 

[그림 15-1]

 

  [그림 15-2]

해당 소스까지만 작성을 한 다음에 과연 제대로 잘 작동이 되는지 확인해보기 위해서 유니티에서 Play버튼을 눌러보도록 하겠습니다.

 

W키와 S키가 눌림과 떼어짐에 따라 Console 탭에서 로그가 찍히면서 Animator 탭에서도 Idle노드에서 Transition을 타고 이동하여 Walk_Audio노드의 애니메이션이 구동되는 것을 확인하실 수 있을 것입니다.(그림 16)

 

[그림 16]

하지만, 여러분께서 어떠한 애니메이션 파일을 쓰느냐에 따라 애니메이션의 재생속도가 빠르게 느껴지고 느리게 느껴지는 것이 있을 것이라 생각되어집니다.

 

그렇기에 여러분게서 원하시는 속도로 애니메이션을 재생시켜줄 수 있는 옵션 설정법을 알려드리고 넘어가도록 하겠습니다.

 

속도가 자신이 생각하였을 때 빠르거나 느리다고 생각되어지는 애니메이션 노드를 Animatior탭에서 클릭하여 줍니다.

 

그러면 Inspector탭에서도 제일 위에 Speed라는 항목이 보이실 것인데 해당 항목의 수치를 변경하시게 되면, 애니메이션의 재생속도를 조절할 수 있습니다.(그림 17)

 

[그림 17]

이제 캐릭터의 애니메이션만 구동 시켜주는 것이 아닌 애니메이션과 함께 캐릭터의 위치를 이동시켜주는 소스를 추가적으로 작성해보도록 하겠습니다.

 

moveController 스크립트의 move()함수부에 그림 18과 같이 추가 작성하여주시기 바랍니다.

 

[그림 18]

이렇게 작성을 하신 후 저장하신 다음에 Hierarchy탭에서 MMD 캐릭터 오브젝트를 클릭하여 Inspector탭에서 moveController 스크립트 부분에 보시면 Move Speed라는 항목이 보이실 것인데, 해당 항목의 수치 값을 2로 작성하시기 바랍니다.(그림 19-1)

 

[그림 19-1]

이렇게 Move Speed항목의 수치를 변경하신 후 유니티에서 Play버튼을 눌러보도록 하겠습니다.

 

어떠한 현상을 확인해 보실 수 있나요?

 

분명 우리는 키보드의 W키와 S키가 입력 받았을 때만 캐릭터를 이동시키고 싶은 것인데 유니티에서 Play버튼을 누르자마자 캐릭터가 Idle애니메이션 상태로 계속 앞으로 이동하는 것을 보실 수 있을 것입니다.(그림 19-2)

 

[그림 19-2]

그렇기에 우리가 원하는 대로 키가 입력되었을 시에만 캐릭터를 이동시켜주기 위하여, moveController스크립트를 수정해주도록 하겠습니다.(그림 20-1, 20-2)

 

[그림 20-1]

 

[그림 20-2]

왜 전역 Float형 변수를 선언하여 사용하고 있는지 이해하시는 것은 여러분에게 맡기도록 하겠습니다.

 

정말 도저히 왜 moveOn이라는 변수를 선언하여 사용하여 주었고, 왜 작성하였는지 모르겠다는 분이 계시다면 언제든지 댓글로 질문 남겨주시기 바랍니다.

 

자 이렇게 moveController 스크립트를 수정하여 저장한 후 다시 유니티에서 Play버튼을 눌러보도록 하겠습니다.

 

그럼 조금 전과는 다르게 키보드 W키와 S키가 입력되었을 시에만 캐릭터가 걷기 애니메이션을 구동시키며 위치가 이동되어지는 것을 Game뷰에서 확인하실 수 있을 것입니다.

(그림 21-1, 21-2)

 

[그림 21-1]

 

 

[그림 21-2]

 

 

하지만 여기서 우리는 또 다른 하나 이상한 점을 느낄 수 있을 것입니다.

 

그것은 W키를 누르나 S키를 누르나 캐릭터가 바라보는 방향을 향해 무조건 앞으로만 이동된다는 점입니다.

 

분명 튜토리얼을 시작하기에 앞에서 S키 입력은 캐릭터가 바라보는 반대 방향을 향해 갈 수 있도록 하겠다고 말씀드렸습니다.

 

반대 방향으로 캐릭터가 회전하여 이동할 수 있도록 하기 위하여 moveController스크립트의 move()함수부에서 S키가 입력되어지는 부분의 코드를 수정해 주도록 하겠습니다.(그림 22)

 

[그림 22]

그림22와 같이 작성을 하신 다음에 저장을 하시고 유니티에서 다시 Play버튼을 눌러 테스트를 해보았습니다.(그림 23)

 

[그림 23]

그럼 조금전과는 다르게 캐릭터가 바라보는 방향을 반대 방향으로 회전하여 이동하는 것을 Game뷰에서 확인하실 수 있을 것입니다.

 

여기서 더 진행하기에 앞서 move()함수부의 transform.TransformDirection에 대하여 설명드리겠습니다.

 

설명에 앞서 어떠한 차이가 있는지 여러분께서도 직접 경험해보실 수 있게 다음 그림과 같이 해당 부분을 주석 처리하신 다음 유니티에서 Play버튼을 눌러보시기 바랍니다.(그림 24-1, 24-2, 24-3)

 

[그림 24-1]

 

[그림 24-2]

 

 

[그림 24-3]

해당 부분을 주석처리하니 조금전과는 어떠한 차이가 있나요?

 

W키나 S키 상관 없이 카메라와 멀어지는 캐릭터의 모습을 확인하실 수 있을 것입니다.

 

그 이유는 로컬좌표를 중심으로 캐릭터를 이동시키느냐, 월드좌표를 중심으로 캐릭터를 이동시키느냐의 차이인 것입니다.

 

여기서 눈치가 빠르신 분들을 해당 부분이 무슨 역활을 해주는지 눈치채실 것입니다.

 

transform.TransformDirection로 Vector3형 변수인 move값을 월드좌표 즉, 캐릭터가 중심이 되어지는 좌표로 변경을 해주는 역활을 하는 것입니다.

 

문자로써 백번 설명을 드리는 것 보다 그림을 함께 보시면서 여러분께서 다시 한번 유니티에서 실행을 시켜보셔서 이해하시는 것을 추천드리겠습니다.(그림 24-4)

 

[그림 24-4]

그렇기 때문에 만약 여러분께서 나중에 캐릭터를 이동시키는 부분을 작성하실 때는 카메라가 바라보는 시점을 기준(로컬좌표)으로 이동시킬 것인지, 캐릭터가 바라보는 방향을 기준(월드좌표)으로 이동시킬 것인지를 결정하셔서 작성하셔야 하는 부분이 되겠습니다.

 

하지만 제 튜토리얼에서는 캐릭터가 바라보는 방향을 기준으로 하여 이동시켜 줄 것이기 때문에 해당 부분의 주석처리를 풀도록 하겠습니다.(그림 24-5)

 

[ 그림 24-5]

 

반응형