지나주 MYPI

지나주
접속 : 3605   Lv. 41

Category

Profile

Counter

  • 오늘 : 67 명
  • 전체 : 130390 명
  • Mypi Ver. 0.3.1 β
[게임 개발] 유니티에서 Anmation 적용하기 (10) 2014/10/25 PM 12:00

착한 포커 개발 초기에는 유니티에 메카님 애니메이션 기능이 없었습니다.
때문에 레가시 애니메이션으로 간단하게 구현할 수 있었는데요...

어느 순간 유니티를 업그레이드 하다보니, 메카님 애니메이션을 사용해야 한다고 나오더군요.
시간도 없고, 기존에 작업한 내용들도 많고 해서 일단은 레가시 애니메이션을 꼼수처럼 계속 써왔었습니다.


착한 포커는 그렇게 마무리하고, 이제 시간을 내어 메카님을 공부하고 있는데요.
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 하이폰이 들어가네요.
제가 낸 오타가 아닙니다. ㅠㅠ 무슨 이유인지 모르겠네요...

신고

 

RainyNight    친구신청

styte--:p-osition 방지 때문에 그런거같네요ㅋㅋ;;

지나주    친구신청

아 ㅠㅠ
(무릎을 탁!)

아여름은너무덥다    친구신청

2d이시면 저는 차라리 스파인을 배우는걸 추천드려요...
유니티랑 호환성도 좋고 기능도 다양하고... 일단 배우면 유니티 하나에서만 쓰는것이 아니니까요

지나주    친구신청

스파인 첨 들어보네요.
한번 공부해봐야겠습니다.

감사합니다!

zzick2    친구신청

스파인이나 스무스무브는 크게 좋다는 느낌을 못 받았지만
세일을 한다면 기다리는 툴로 (90$)

Uni2D 라는 플러그인인데
이게 2d이미지만으로 이런 동작이 가능 하다면 시간과 노력에 비해 좋은 결과 물이 나올거 같아 기다리고 있습니다.

http://www.uni2d-plugin.com/
http://www.youtube.com/watch?v=C_bw-UF1PjU

지나주    친구신청

유니티는 역시 플러그인이 많군요.

zzick2    친구신청

"예를 들어볼게요. 저는 캐릭터가 죽을 때 소닉이나 마리오처럼 죽은 자리에서 y축으로 올라갔다 화면 아래로 내려오는 애니메이션을 기획했습니다."

혹시 캐릭터가 죽는 애니메이션 프레임 위치에
애니메이션 이벤트를 적용시켜 카메라가 내려오는 함수를 호출을 하거나
메카님에 올라갔다 내려오는 애니메이션을 연결해서 호출하면 안되는지요 ^^;

제가 아직 초보라 맞는건지 모르겠지만 될것도 같아서

지나주    친구신청

네. 카메라는 움직이지 않고 화면에서 캐릭터만 죽는 애니메이션(y축 only)을 넣으려고 해서요.
애니메이션 프레임 위치에서 x, z 프로퍼티들 다 제거하고 y 프로퍼티만 남겨놓아도 실행하면 x = 0, z = 0 위치에서 시작하게 되더군요.
구현시에 메카님 State(상태)에 위의 die 애니메이션을 연결한 상태이고요. ㅠㅠ

결과적으로는 본문에 적은 것처럼 빈 오브젝트를 위에 올려서 해결한 상태입니다~

토끼안은곰도리♥    친구신청

스파인 괜찮아요...리소스도 적게먹고 맵교체도 쉽고........상당히 강력한툴이에요

지나주    친구신청

비싸지만 않으면 좋겠네요.
감사합니다!
X