착한 포커 개발 초기에는 유니티에 메카님 애니메이션 기능이 없었습니다.
때문에 레가시 애니메이션으로 간단하게 구현할 수 있었는데요...
어느 순간 유니티를 업그레이드 하다보니, 메카님 애니메이션을 사용해야 한다고 나오더군요.
시간도 없고, 기존에 작업한 내용들도 많고 해서 일단은 레가시 애니메이션을 꼼수처럼 계속 써왔었습니다.
착한 포커는 그렇게 마무리하고, 이제 시간을 내어 메카님을 공부하고 있는데요.
2D 애니메이션쪽만 살펴보고 있습니다. 저는 3D 게임을 만들 일은 없을 거 같아서요.
2D 메카님 애니메이션쪽보다는 3D쪽이 강좌나 자료가 많더라구요. 그래서 2D쪽으로 공부하기가 쉽지는 않았습니다.
그래도 다행히 (한글로 된!) 좋은 예제를 찾아서 어느정도 감을 잡았네요.
(게시물 링크 참고)
저는 2DToolkit을 사용했기 때문에 문서 윗부분은 스킵하고, "애니메이션을 만든다" 항목부터 따라했습니다.
예제에서는 Unity 2D 스프라이트를 사용했는데 2DToolkit을 사용하더라도 구현에는 문제가 없었습니다. 당연한 말이겠지만요.
메카님 공부 시작하기 전에 제일 궁금했던 것이
1. 상태 변이를 위한 변수는 어디서 선언하고 어디서 제어하는가?
2. 상태 변이시 전 상태 - 다음 상태 스프라이트가 모핑되는가?
였습니다.
스터디를 통해 얻은 답은
1. 상태 변이를 위한 변수는 어디서 선언하고 어디서 제어하는가?
> 상태 변이를 위한 변수는 메카님 안에서 선언된다.
> 제어는 해당 오브젝트의 스크립트에서 제어된다.
Animator animator ;
animator = GetComponent < Animator > (); // 오브젝트 안에 적용된 Animator
animator . SetFloat ( "DirectionX" , dx ); // Animator에 DirectionX로 선언된 변수에 스크립트의 dx값을 전달
> 메카님 안의 DirectionX를 참고하는 상태 변환이 진행됨
2. 상태 변이시 전 상태 - 다음 상태 스프라이트가 모핑되는가?
> 3D 애니메이션은 어떨지 모르겠는데, 2D 애니메이션에서는 스프라이트가 모핑되거나 하는 느낌은 없네요.
> 다만 다음 상태 스프라이트가 바로 실행되지는 않고, 세팅된 타이밍에 따라 부드럽게 바뀌는 느낌은 듭니다.
> 정리하자면 픽셀 수준의 모핑은 없고, 전환 타이밍은 영향을 받는 듯?
Animator에서 State(상태)와 Transition(상태간 전환)을 정의했고...
그럼 이제 각 상태에 미리 준비한 animation을 적용하면 되는데요.
이 때 생각치 않은 문제가 발생해서 반나절을 고생했습니다. (이 이슈 때문에 이 글을 작성하네요)
유니티의 animation 툴은 p-osition, rotation, scale 등을 쉽게 다루도록 도와줍니다.
문제는 이렇게 준비한 animation을 적용하면, animation이 진행되는 동안 스크립트에서 해당 오브젝트를 제어하는게 먹히지 않았습니다.
예를 들어볼게요. 저는 캐릭터가 죽을 때 소닉이나 마리오처럼 죽은 자리에서 y축으로 올라갔다 화면 아래로 내려오는 애니메이션을 기획했습니다.
Animation 툴로 die 라는 .anim 을 생성하고 Transform의 p-osition을 추가해서 y축에만 곡선 운동 애니메이션을 넣었습니다.
이렇게 만든 animation을 메카님 애니메이터의 상태에 넣어서 돌려보면, 캐릭터가 죽었을 때 죽은 위치에서 애니메이션이 실행되는게 아니라, animator에서 편집할 당시의 x 위치로 순간이동된 후 실행되더라구요.
스크립트에서 animation 실행후 x 위치를 옮겨보려고도 했지만 전혀 먹질 않더군요.
한마디로 animation이 실행되는 동안에는 어떠한 코드로도 해당 오브젝트를 제어할 수 없었습니다.
구글링 한참 한 뒤에 영문 포럼에서 이에 대한 답변을 찾았는데요.
유니티 animation 제작팀의 의도에 의해 animation되는 동안에는 해당 오브젝트가 애니메이션의 제어를 벗어나지 못하도록 설계되었다네요.
그래서 저처럼 y축에 대한 애니메이션만 적용하고 싶어도, x/z축으로도 묶음으로 처리된다고 합니다.
이를 해결하기 위해 몇 가지 꼼수들이 소개되고 있었는데요.
1. 빈 오브젝트를 하나 만들고, 그 밑으로 해당 오브젝트를 넣는다.
저도 이 방법이 제일 쉽고 깔끔해서 이렇게 적용했습니다.
Animation이 적용된 오브젝트에 적용되었던 x축 이동 부분을 다 빼고, parent인 빈 오브젝트로 옮겨심었습니다.
이제 캐릭터가 이동할 때에는 parent인 빈 오브젝트로 x축 좌우 이동을 시키지요.
캐릭터가 죽었을 때에는 빈 오브젝트의 x 위치에서, 해당 오브젝트가 y축으로 움직이게 됩니다.
2. LateUpdate 함수 사용
설명이 나와있는데 1번 방법으로 해결되어서 자세히 살펴보지는 않았습니다.
추가 오브젝트 없이 스크립트로 어떻게 해결할 수 있다고 하네요.
이제 Animator와 Animation에 어느정도 익숙해졌네요.
다음 게임 만들때에는 편하게 작업 할 수 있을 것 같습니다.
돈 없이 사람 없이 게임을 혼자 만들어야 하는 상황이다보니, animation등을 통한 연출에 관심이 많거든요.
시간이 나면 영상 제작, 연출 관련 공부도 해보려고 합니다. (혹시 이쪽 관련해서 추천해 주실만한 책이나 자료 있으면 소개해 주세요~)
ps. 글을 작성한 뒤에 올렸는데 포지션(영어)을 쓰면 자꾸 p-osition 하이폰이 들어가네요.
제가 낸 오타가 아닙니다. ㅠㅠ 무슨 이유인지 모르겠네요...