-
Unity | 크로스페이드(Crossfade) 애니메이션 적용다시한번 개발자도전! 2026. 1. 22. 17:20
< 크로스페이드(Crossfade) >
- 두 개의 상태가 전환될 때, 하나는 서서히 사라지고(Fade-out) 동시에 다른 하나는 서서히 나타나게(Fade-in) 하여 그 사이를 부드럽게 연결하는 기술
1. 애니메이션 크로스페이드 (Animator.CrossFade)
유니티 애니메이터(Mecanim)에서 상태를 바꿀 때, SetTrigger나 SetBool을 쓰면 미리 설정된 '트랜지션(Transition)' 선을 따라감. 하지만 CrossFade() 함수를 쓰면 코드 한 줄로 즉시 부드러운 전환이 가능함.
- 특징: 트랜지션 선을 일일이 연결하지 않아도 됨.
- 동작이 딱딱하게 끊기며 변하는 '팝핑(Popping)' 현상을 막고 자연스러운 움직임을 만들기 위해 씀.
Animator animator; void Start() { animator = GetComponent<Animator>(); Invoke("ChangeAnimation", 5f); //스타트 후 5초뒤 애니메이션이 바뀜 } void ChangeAnimation() { animator.CrossFade("Wmove", 0.2f); }

트렌지션을 연결하지 않아도 애니메이션 변경이 가능해짐 ❗주의 할 점❗
- 도큐먼트에서는 CrossFade("Wmove", 0.2f) 처럼 문자열을 직접 쓰는 것을 지양함. 문자열은 매번 비교 연산을 하기 때문에 성능을 갉아먹음. 대신 Animator.StringToHash를 쓰길 권장함.
2. 크로스페이드(Crossfade)원리 : 선형 보간(Lerp, Linear Interpolation)
크로스페이드가 부드럽게 느껴지는 이유는 수학적으로 선형 보간(Lerp) 원리를 사용하기 때문. 유니티의 Mathf.Lerp, Vector3.Lerp, Color.Lerp 모두 이 공식 하나로 돌아감.
📌 공식
Result = (A \times (1 - t)) + (B \times t)이 공식은 사실 우리가 이해하기 쉽게 줄이면 다음과 같음:
"결과값 = 시작점(A)에서 목표점(B)까지 t(비율)만큼 간 지점"
- A (시작값): 현재 상태 (예: 사라질 애니메이션의 강도 100%)
- B (목표값): 바뀔 상태 (예: 나타날 애니메이션의 강도 100%)
- t (비중/시간): 0에서 1 사이의 값 (0이면 완전한 A, 1이면 완전한 B)
💡크로스페이드 작동원리💡
더보기🔍 크로스페이드에서의 작동 원리
크로스페이드가 진행되는 동안 t값은 시간에 따라 0에서 1로 변함.
- 시작 시점 (t = 0$):👉 A만 보이고 B는 안 보임.(A \times 1) + (B \times 0) = A
- 중간 지점 (t = 0.5$):👉 두 상태가 50%씩 겹쳐 보임.
-
(A \times 0.5) + (B \times 0.5) = 절반씩 섞임
- 종료 시점 (t = 1):👉 A는 완전히 사라지고 B만 남음.
-
(A \times 0) + (B \times 1) = B
3. CrossFade vs SetTrigger (성능 및 관리)
비교 항목 SetTrigger (Transition) CrossFade (Script-based) 제어 방식 에디터에서 선으로 연결 스크립트에서 이름으로 호출 유연성 조건(Parameter)에 종속됨 언제 어디서든 즉시 실행 가능 메모리/성능 상태 머신 데이터 미리 로드 호출 시 문자열 해싱(Hashing) 비용 발생 '다시한번 개발자도전!' 카테고리의 다른 글
Unity | 타일맵(TileMap)과 룰타일(RullTile) (0) 2026.02.02 Unity | 직렬화(SerializeField)란? (0) 2026.01.23 Unity | 반복자(IEnumerator) 와 열거자(IEnumerable) (0) 2026.01.21 Unity | 코루틴(Coroutine)과 Async/Await(Task) (0) 2026.01.21 Unity | 싱글턴 패턴 (Singleton) (0) 2026.01.20