Artoke

애니메이션 스테이트 머신, 이렇게 쉬울 수가!

애니메이션 스테이트 머신, 이렇게 쉬울 수가! 대표 이미지
출처: 애니메이션 스테이트 머신

애니메이션 스테이트 머신, 이렇게 쉬울 수가!

게임 속 캐릭터는 가만히 서 있다가, 갑자기 달리고, 폴짝 뛰기도 해요. 어떻게 딱딱 맞춰 움직일까요? 비밀은 스테이트 머신이라는 아주 똑똑한 규칙표에 있어요.

스테이트 머신이 뭐예요?

스테이트 머신은 한국어로 상태 기계라고 해요. 이름이 어려워 보이지만 뜻은 아주 간단합니다.

  • 상태(State): 지금 무엇을 하고 있는가. 예: 서 있기, 달리기, 점프하기
  • 전환(Transition): 한 상태에서 다른 상태로 넘어가는 길
  • 입력(Input): 넘어가게 만드는 신호. 예: 버튼 누르기

규칙은 딱 하나예요. 한 번에 하나의 상태만 될 수 있다. 서 있으면서 동시에 달릴 수는 없어요. 사람도 마찬가지죠. 자고 있으면 밥을 먹을 수 없어요.

지하철 개찰구로 배워요

지하철 입구에 있는 회전문(개찰구)을 떠올려 보세요. 이 문은 스테이트 머신의 가장 유명한 예시랍니다.

지하철 입구의 회전식 개찰구 사진
A turnstile · 출처: 애니메이션 스테이트 머신

이 개찰구의 상태는 딱 두 개예요.

  1. 잠김: 밀어도 안 돌아가요.
  2. 열림: 밀면 돌아가요.

그리고 신호는 두 가지입니다. 동전 넣기밀기예요.

잠김 상태에서 동전을 넣으면 → 열림이 됩니다. 열림 상태에서 밀면 → 다시 잠김이 됩니다. 그런데 잠김 상태에서 아무리 밀어도? 그냥 잠김 그대로예요. 열림 상태에서 동전을 또 넣으면? 그냥 열림 그대로고, 동전만 아깝죠.

개찰구의 잠김 상태와 열림 상태를 화살표로 연결한 상태 다이어그램
State diagram for a turnstile · 출처: 애니메이션 스테이트 머신

중요한 점이 있어요. 개찰구는 어제 동전을 몇 개 받았는지 기억하지 않아요. 오직 "지금 잠겼나, 열렸나"만 알면 충분합니다. 이렇게 기억할 상태의 개수가 정해져 있고 유한하기 때문에 "유한 상태 기계"라고 부릅니다.

그림으로 한눈에 보기

아래 그림은 게임 캐릭터의 스테이트 머신이에요. 동그라미가 상태, 화살표가 전환입니다.

애니메이션 스테이트 머신, 이렇게 쉬울 수가! 도식

화살표를 잘 보세요. 대기에서 점프로 바로 가는 화살표가 없죠? 길이 없으면 못 갑니다. 스테이트 머신은 정해진 길로만 움직여요. 그래서 캐릭터가 이상하게 뒤엉키지 않아요.

언리얼 애님 블루프린트에서는?

언리얼 엔진의 애님 블루프린트에는 이 그림을 그대로 그리는 화면이 있어요. 진짜로 동그라미를 놓고 화살표를 잇습니다.

  • 상태 노드: 그 안에 애니메이션 하나를 넣어요. "대기" 상태에는 서 있는 애니메이션을 넣죠.
  • 전환 규칙: 화살표를 클릭하면 조건을 적을 수 있어요. "속도가 0보다 크면 참(true)"처럼요.
  • 블렌드 시간: 상태가 바뀔 때 툭 끊기지 않게, 0.2초 동안 부드럽게 섞어줘요.

캐릭터의 속도나 버튼 입력 같은 값은 매 순간 계산해서 변수에 담아둡니다. 전환 규칙은 그 변수를 계속 쳐다보면서 "지금 넘어갈 때인가?"를 묻고 있어요.

토스터로도 만들 수 있어요

스테이트 머신은 게임에만 쓰는 게 아니에요. 빵을 굽는 토스터에도 들어 있습니다. "문 열림", "굽는 중", "다 됨" 같은 상태로요.

토스터 오븐을 상태와 전환으로 표현한 상태 차트 예시
Fig. 1 UML state chart example (a toaster oven) · 출처: 애니메이션 스테이트 머신

엘리베이터, 신호등, 자판기, 세탁기… 전부 스테이트 머신이에요. 여러분 주변의 기계들은 사실 다 이 규칙표를 마음속에 품고 있답니다.

두 가지 종류가 있어요

스테이트 머신에는 두 가족이 있어요.

결정적(deterministic) 스테이트 머신은 갈 길이 하나로 딱 정해져 있어요. "동전을 넣으면 무조건 열림." 헷갈릴 일이 없죠.

비결정적(non-deterministic) 스테이트 머신은 같은 신호에 갈 수 있는 길이 여러 개예요. 갈림길에서 어디로 갈지 정해지지 않은 거죠.

재미있는 사실! 비결정적인 것은 언제나 결정적인 것으로 바꿀 수 있어요. 갈림길이 있는 지도를, 헷갈리지 않는 지도로 다시 그릴 수 있다는 뜻이에요. 게임에서 쓰는 애니메이션 스테이트 머신은 대부분 결정적입니다. 캐릭터가 마음대로 헷갈리면 안 되니까요.

간단한 유한 상태 기계의 예시 그림
Fig. 3 Example of a simple finite-state machine · 출처: 애니메이션 스테이트 머신

잘 만드는 세 가지 요령

1. 상태를 너무 많이 만들지 마세요. 상태가 20개가 되면 화살표는 수백 개가 됩니다. 스파게티가 되어버려요. 비슷한 것끼리는 묶으세요. "왼쪽 달리기", "오른쪽 달리기"를 따로 두지 말고 "달리기" 하나로 합치는 식이죠.

2. 조건은 겹치지 않게. 화살표 두 개의 조건이 동시에 참이 되면, 캐릭터가 어디로 갈지 헷갈려요. 조건은 서로 부딪히지 않게 정해 주세요.

3. 돌아올 길을 꼭 만드세요. 들어가기만 하고 나오는 길이 없는 상태는 함정이에요. 점프 상태에 빠진 캐릭터가 영원히 공중에 떠 있게 될 수 있어요.

정리해 볼까요

  • 스테이트 머신 = 상태 + 전환 + 입력
  • 한 번에 오직 하나의 상태만 가질 수 있어요.
  • 상태의 개수는 유한해요. 그래서 다루기 쉬워요.
  • 화살표(길)가 없으면 그쪽으로 못 가요. 그래서 안전해요.
  • 언리얼 애님 블루프린트는 이 그림을 마우스로 직접 그리는 도구예요.

다음에 게임 캐릭터가 뛰고 구르는 걸 보면 떠올려 보세요. 그 안에서는 지금도 작은 동그라미들이 화살표를 따라 부지런히 옮겨 다니고 있답니다.

출처

광고

리깅 파이프라인 자동화 도구

반복 작업은 스크립트에게. 현업에서 쓰는 리깅 툴 모음.

리깅 도구 보기