핵심 정리
animator.SetBool("IsRunning", true);
animator.SetTrigger("Attack");구조 이해
파라미터 타입과 역할
Animator Controller는 상태와 전이 조건을 시각적으로 관리하며, 파라미터는 그 조건을 코드에서 바꾸는 통로입니다. 타입에 따라 용도가 다릅니다. Bool은 이동 중인지 여부처럼 상태를 유지해야 할 때 쓰고, Float는 캐릭터 속도처럼 연속적으로 변하는 값을 전달할 때 씁니다. Trigger는 공격이나 피격처럼 한 번 발생하는 이벤트에 적합하며, 소비되면 자동으로 리셋됩니다.
이동과 공격에 적용하는 예제
아래는 방향키 입력으로 Speed 파라미터를 갱신하고 스페이스바로 점프 트리거를 발동하는 예입니다.
[SerializeField] private Animator animator;
private void Update()
{
float speed = Mathf.Abs(Input.GetAxisRaw("Horizontal")) + Mathf.Abs(Input.GetAxisRaw("Vertical"));
animator.SetFloat("Speed", speed);
if (Input.GetKeyDown(KeyCode.Space))
{
animator.SetTrigger("Jump");
}
}이동, 공격, 피격, UI 열림/닫힘 같은 연출 전환을 코드와 Animator Controller 사이에서 연결할 때 이 패턴이 핵심입니다.
문자열 이름 관리
파라미터 이름을 코드 곳곳에 문자열 리터럴로 흩어 놓으면 오타가 났을 때 조용히 동작이 어긋납니다. Animator.StringToHash로 정수 ID를 캐싱하거나, 상수로 한 곳에 모아 두는 것이 실수를 줄이는 일반적인 방법입니다. 특히 매 프레임 호출되는 경로라면 해싱 비용을 미리 처리해 두는 편이 좋습니다.
체크포인트
| 상황 | 적합한 선택 |
|---|---|
| 이동 중 여부처럼 상태 유지 | SetBool |
| 속도처럼 연속으로 변하는 값 | SetFloat |
| 공격·피격처럼 한 번성 이벤트 | SetTrigger |
| 매 프레임 파라미터 갱신 | Animator.StringToHash로 ID 캐싱 |
| 파라미터 이름 여러 곳에 흩어짐 | 상수 또는 해시 ID로 한곳에 모으기 |
| 파라미터 타입 | 더 잘 맞는 상황 | 흔한 실수 |
|---|---|---|
Bool | 켜짐/꺼짐 상태가 유지돼야 함 | 한 번성 이벤트를 Bool로 처리해 reset 타이밍이 꼬임 |
Float | 속도, 방향, blend 값처럼 연속량 전달 | 값 범위를 설계하지 않아 전이가 불안정함 |
Trigger | 공격, 점프, 피격처럼 한 번성 신호 | 연속 입력을 모두 Trigger로만 처리해 상태 추적이 어려움 |
주의할 점
파라미터 이름 오타는 런타임에 조용히 어긋납니다. 문자열 직접 사용 대신 ID를 캐싱하세요.
// ❌ 매 Update마다 문자열로 호출 — 오타 위험 + 해싱 비용
animator.SetFloat("Speed", speed);
// ✅ 정수 ID 캐싱으로 오타 방지 + 성능 개선
private static readonly int SpeedId = Animator.StringToHash("Speed");
private static readonly int JumpId = Animator.StringToHash("Jump");
animator.SetFloat(SpeedId, speed);
animator.SetTrigger(JumpId);서로 배타적인 전이를 여러 Bool로만 제어하면, 어느 상태가 우선인지 Controller가 복잡해지고 디버깅이 어려워집니다. 유지 상태와 순간 이벤트를 나눠 설계하세요.
// ❌ 점프, 공격, 피격을 전부 Bool로 제어
IsJump = true
IsAttack = true
IsHit = true
→ 어떤 전이가 먼저 타야 하는지 조건이 꼬임
// ✅ 유지 상태와 순간 이벤트를 분리
IsGrounded = Bool
Speed = Float
Attack = Trigger
Hit = Trigger참고 링크
2 sources