여러 애니메이션을 자연스럽게 전환하는 시스템으로 하나의 애니메이션 상태(State)이다.
| 기능 | 일반 Transition | Blend Tree |
|---|---|---|
| 전환 방식 | 단순한 애니메이션 변경 | 애니메이션을 혼합하여 부드럽게 변화 |
| 사용 예시 | Idle → Walk → Run | 속도에 따라 자연스럽게 애니메이션 변화 |
| 장점 | 간단하고 직관적 | 자연스럽고 유연한 애니메이션 가능 |
| 단점 | 전환이 딱딱할 수 있음 | 설정이 상대적으로 복잡함 |
이전과 같이 Animator에서 좌클릭을 하여 Create State를 클릭하고 From New Blend Tree를 클릭하여 만들어 주면 된다.

그럼 위의 사진과 같이 이전에 존재하던 5개의 State에 추가로 하나의 State가 추가된 것을 볼 수 있다. (이름을 WAIT_RUN으로 변경)
그런 후에 WAIT_RUN을 더블클릭하게 되면 아래와 같은 화면이 나오게 된다.

이제 Blend Tree를 좌클릭을 한후 Add Motion을 눌러 섞을 애니메이션 파일을 추가하여준다.

Add Motion을 하게 되면 Blend Tree의 Inspector의 Motion부분에 하나가 더 추가되는데 이런 식으로 추가하여도 되고 Inspector에서 직접 추가도 가능하다.
애니메이션 파일들을 섞을 기준이 될 Float타입의 파라미터 wait_run_ratio를 추가해준다.

그 이후에 Inspector의 Parameter부분을 방금 만든 wait_run_ratio로 변경해준다.

위의 사진과 같이 Motion에 지금 사용하는 RUN00_F와 WAIT00을 추가해준다.
WAIT00 의 Threshold값 = 0RUN00_F 의 Threshold값 = 1이렇게 하면 이 애니메이션은 WAIT00과 RUN00_F의 애니메이션 두가지를 섞은 애니메이션이 된다.
wait_run_ratio 값이 0에 가까울 수록 WAIT00 애니메이션의 비중이 커진다.wait_run_ratio 값이 1에 가까울 수록 RUN00_F 애니메이션의 비중이 커진다.wait_run_ratio 값이 0.5라면 절반이기에 반반씩 섞인 애니메이션이 재생된다.wait_run_ratio의 값 변화는 코드에서 작성한다. float wait_run_ratio = 0;
void Update()
{
if (_moveToDest)
{
...
}
if (_moveToDest)
{
wait_run_ratio = Mathf.Lerp(wait_run_ratio, 1, 10.0f * 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, 10.0f * Time.deltaTime);
Animator anim = GetComponent<Animator>();
anim.SetFloat("wait_run_ratio", wait_run_ratio);
anim.Play("WAIT_RUN");
}
}
wait_run_ratio : Float 타입의 변수로, 대기(wait)와 달리기(run) 상태를 보간하는 비율을 저장한다.wait_run_ratio 값이 1에 가까워지도록 Lerp() 함수를 사용하여 보간한다.
현재 wait_run_ratio 값에서 1로 점진적으로 변경된다.
10.0f * Time.deltaTime 값이 커질수록 더 빠르게 1에 수렴한다.
보간된 wait_run_ratio 값을 애니메이션 파라미터로 설정한다.
애니메이션 블렌드 트리 "WAIT_RUN" 실행
wait_run_ratio 값이 0에 가까워지도록 Lerp() 함수를 사용하여 보간한다.
현재 wait_run_ratio 값에서 0으로 점진적으로 감소한다.
10.0f * Time.deltaTime 값이 크면 더 빠르게 0에 도달한다.
보간된 wait_run_ratio 값을 애니메이션 파라미터로 설정한다.
애니메이션 블렌드 트리 "WAIT_RUN" 실행