본문 바로가기
개발/Unity 내일배움캠프 TIL

Unity2D 애니메이터 State와 Transition

by 석시 2023. 9. 13.



애니메이션을 구현하다보면, 단계별로 진행되는 애니메이션이 아니라 말그대로 특정 조건을 만족하기만 하면 애니메이션을 재생하도록 설정하고 싶은 경우도 있다.

피격 모션이나, 죽을 때 애니메이션과 같은 경우가 그것이다.

해당 기능들을 구현하기 위해 쓰는 각 State와 Transition들에 대해 알아볼 것이며, 예시로 State Diagram을 어떻게 구성하는지 소개할 것이다.


애니메이터 State

애니메이터를 더블클릭하면 나오는 Animator 창에서 State의 구성을 볼 수 있다.

각 블럭 하나하나가 State이다.

주황색 블록과 짙은 회색의 블록들은 내가 추가한 Animation을 재생하는 State이고, 나머지는 특수한 조건을 구현하기 위한 특수 State들이다.


Transition

한 State에서 다른 State로 넘어갈 때의 조건을 결정해주는 것을 Transition이라 한다.

우클릭해서 Make Transition을 할 수 있다.

조작할 수 있는 다양한 Property를 두어 State를 다양한 모양으로 넘어갈 수 있도록 설정을 해줄 수 있다.

Parameters

Transition을 언제 할 지 조건을 두는 Property이다.

먼저 Animator 창의 Parameters에서 파라미터를 먼저 추가하자.

Parameter에는 Float, Bool, Int, Trigger가 있다.

BoolTrigger가 뭐가 다르냐면, Bool은 값을 바꾸면 그 파라미터 값이 계속 유지가 된다.

근데 Trigger의 경우는 이걸 켜면(true) Transition이 이루어지고, Transition이 되고 나면 바로 꺼져버린다(false).

Conditions

파라미터를 추가하고 나면 다음과 같이 비어 있는 Condition에 Condition을 추가해줄 수 있다.

Animator 창에서 Transition을 클릭하면 나오는 Inspector

이렇게 설정하면 State 0 → State 1 Transition이라고 했을 때 State 0에서 IsMovetrue이면 State 1로 넘어가게 된다.

다음과 같이 여러 조건을 넣을수도 있는데 이 경우 List에 있는 조건들을 모두 만족해야 Transition을 수행한다!

Settings

Transition에 걸어주는 여러 옵션들이다.

  • Has Exit Time : Transition 수행 전에 기존 State에서 나가는 시간, 즉 딜레이를 둘 것인지를 설정한다.
  • Exit Time : Conditions를 만족했을 때 Transition 수행 전에 주어지는 딜레이다.

Transition Duration은 애니메이션 간의 부드러운 전환을 위한 시간 값이다.

Transition Duration이 0보다 길면 해당 시간만큼 A → B로 부드럽게 전환이 된다.

3D에서는 애니메이션을 메카님 시스템과 같은 것을 사용할 때 주로 쓰지만, 2D에서는 Sprite 변화로 애니메이션을 구현하기 때문에 잘 사용하지 않는다.

  • Fixed Duration : true면 Duration을 초(s)로 설정하고, false면 퍼센트(%)로 설정한다.
  • Transition Offset : Transition 시 다음 State의 Animation을 언제 Play 할 것인지에 대한 값이다.

  • Interruption Source : 전환이 중단될 수 있는 상황을 만드는 것이다.

전환 중단에 대해선 다음 문서를 참고하자.

애니메이션 전환 - Unity 매뉴얼
애니메이션 전환(Animation transitions)을 사용하면 상태 머신이 하나의 애니메이션 상태에서 다른 애니메이션 상태로 전환하거나 혼합될 수 있습니다. 전환은 상태 간의 혼합이 가져야 하는 기간뿐만 아니라 활성화해야 할 조건을 정의합니다. 특정 조건이 충족될 때만 전환이 발생하도록 설정할 수 있습니다. 이러한 조건을 설정하려면 애니메이터 컨트롤러에서 파라미터의 값을 지정해야 합니다.
https://docs.unity3d.com/kr/2021.3/Manual/class-Transition.html#TransitionInterruption


특수 State들

Entry, Exit

특수 State들을 이해하기 전에 먼저 알아야 하는 애니메이터의 흐름이라는 것이 있는데,

애니메이터의 한 흐름은 Entry에서 시작되어 이런저런 State들을 넘나들다가, Exit로 가면 한 흐름이 끝나는 것이다.

흐름이 끝나면 어떻게 되나요?

그냥 다시 Entry에서 다시 시작된다.

Entry에서 시작되면 바로 Default State로 설정되어 있는 주황색 블록으로 넘어가게 되는데, Default State를 바꾸고 싶다면 다른 State를 우클릭해 Set as Layer Default State를 클릭하면 된다.

두번째의 Set as Layer Default State

Any State

Any State는 말그대로 지금 현재 어떤 State에 있는지 상관 없이 넘어가고 싶은 State를 연결하는 State이다.

만약 위와 같이 연결되는 Transition들이 모두 같은 Condition이라면, 다음과 같이 훨씬 간단하게 만들 수 있다.

Any State를 위한 파라미터는 주로 Trigger를 사용하게 된다.


예시) 기본, 달리기, 피격 상태 구현

예시1. Any State의 Can Transition To Self 사용

다음과 같이 구현할 수 있다.

Any State → HURT의 Conditions

Any State → HURT의 조건을 bool로 했는데, 이 경우 Die = true로 하면 HURT → HURT Transition도 계속 발생하기 때문에 HURT 애니메이션의 첫 프레임만 반복해서 보이는 문제점 이 있다.

이는 자기 자신으로의 Transition을 허용하는 옵션인 Can Transition To Selffalse로 해주면 문제가 해결된다.

Any State Transition에서만 보이는 옵션인 Can Transition To Self

예시 2. Trigger 사용

bool 값을 쓰지말고 Trigger를 사용하는 것이 조금 더 편하긴 하다.

예시 3. Exit 활용

위 예시 1에서 Any State → HURT로 간 후 HURT → IDLE로 빠져 나가도록 할 수 있지만, Exit에 연결해줘도 된다.

이렇게 되면 HURT 애니메이션 재생 후 Exit로 나가고, 다시 Entry로 들어와 IDLE이 재생되게 할 수도 있다.

이 때 HURT → Exit Transition에 약간의 Exit Time을 두는 것이 좋다.


Uploaded by N2T