주녘공부일지

[Unity] Animation Blending 본문

GameEngine/UnityEngine - Class

[Unity] Animation Blending

주녘 2022. 3. 23. 18:59
728x90

Animation Blending 이란?

블랜드 트리를 활용하여 두 가지 이상의 모션을 섞는 것으로, 매끄러운 애니메이션 재생을 위해 사용함

( 즉, 애니메이션 변화에 딜레이를 주면서 딜레이되는 시간동안 모션을 섞는 것이라고 봐도 무방 )

 

Blend Type

1D : 블랜드 할 기준 값이 하나만 필요한 블랜드 트리에 사용 ( 아래 예제의 wait_run_ratio 파라미터 )

 

2D Simple Directional

- 모션이 다른 방향을 표시할 때 유용, 같은 방향으로 여러 모션을 가질 수 없음

 ex) 앞으로 걷기, 뒤로 걷기, 오른쪽으로 걷기, 왼쪽으로 걷기

 

2D Freeform Directional

- 모션이 다른 방향을 표시하고 같은 방향에서 여러 모션을 가질 수 있음

 ex) 앞으로 걷기, 앞으로 뛰기 + 대기 상태 포지션(0, 0)에 싱글 모션을 포함하는 것이 좋음

 

2D Freeform Cartesian

- 블랜드 할 기준 값이 두개가 필요하지만, 모션이 다른 방향을 가리키지 않을 때 유용함

 ex) 앞으로 걷고 돌지않기, 앞으로 뛰고 돌지 않기, 앞으로 걷고 오른쪽으로 돌기, 등

 

Direct : 얼굴 표정, 등의 랜덤한 대기 상태의 블렌딩에 사용 ( 각 노드의 가중치를 직접 컨트롤 )

 


Animation State Machine // Blend Tree ( + Blend Type 1D 예제 )

Threshold 기준으로 얼마나 섞일 것인지 지정

void Update()
{
    if (_moveToDest)
    {
        wait_run_ratio = Mathf.Lerp(wait_run_ratio, 1, 10f * Time.deltaTime);
        Animator anim = GetComponent<Animator>();
        anim.SetFloat("wait_run_ratio", wait_run_ratio);
        anim.Play("WAIT_RUN");
    }
    else
    {
        wait_run_ratio = Mathf.Lerp(wait_run_ratio, 0, 10f * Time.deltaTime);
        Animator anim = GetComponent<Animator>();
        anim.SetFloat("wait_run_ratio", wait_run_ratio);
        anim.Play("WAIT_RUN");
    }
}

_moveToDest 는 이동 상태인지를 나타내는 bool 타입 변수

Mathf.Lefp(선형보간)를 사용해서 0 ~ 1까지의 값을 wait_run_ratio라는 float형 애니메이터 파라미터에 입력하여 애니메이션이 블랜드 되는 정도를 컨트롤해 부드러운 애니메이션을 재생시킴

 

+ 애니메이션 블랜딩에 대한 간단한 예제로 if else문으로 처리하였지만, 만약 애니메이션이 간단하지 않고 상태의 수가 많을 경우에는 스테이트 패턴을 활용해 처리하는 것이 바람직

https://godgjwnsgur7.tistory.com/42

 

[Unity] 상태 패턴 (State Pattern)

상태 패턴(스테이트 패턴)이란? 상태 패턴은 오브젝트의 상태에 따라 동작이 달라질 때 이용하는 디자인 패턴 using System.Collections; using System.Collections.Generic; using UnityEngine; public class Pla..

godgjwnsgur7.tistory.com

 


Animation State Machine // Transition

Has Exit Time

종료 시점을 활성화 하는 옵션 ( 전이 조건은 트랜지션의 컨디션 조건 )

- 활성화 시 : 전이 조건이 만족해도 종료 시점이 되야 전이 ( 애니메이션 실행 끝나고 이동 )

- 비활성화 시 : 전이 조건이 만족하는 즉시 전이 ( 애니메이션 도중 이동 )

 

+ 위 예제의 Has Exit Time이 꺼져있는 이유는 2D Blend Type에서 Idle 모션을 가지고 있기 때문

 

Fixed Duration : Setting 값들이 초 단위 ( 0.25 -> 0.25초 ), % 단위 ( 0.25 -> 25% )

Transition Duration : 두 애니메이션을 섞어서 스무스하게 만드는 시간 ( 값이 클수록 느려짐 )

Transition Offset : 트랜지션이 일어나는 시간을 미룸 ( 값이 클수록 느려짐 )

 


Blend Type 2D 예제 ( 2D Freeform Directional )

- 빨간색 점은 현재 섞인 정도를 컨트롤하기 위한 현재 위치이며, 참조 파라미터로 설정해놓은 DirX, DirZ값에 따라 빨간 점이 이동하고 각 모션 (파란 점) 에 빨간 점의 유효 거리(범위)에 닿은 상태에서 근접한 거리에 따라 모션(파란 점)이 활성화됨 (가까운 정도에 따라 섞는 정도를 조절)

즉, 빨간색 점이 서서히 움직이면, 위치에 따라 근접해진 모션들이 활성화 되며, 활성화된 모션들이 블랜딩되면서 부드러운 모션을 실행하게 됨

728x90