가이드사용법6분 읽기

Godot 4에서 3D 캐릭터 리깅하고 애니메이션 넣기: AFK AI 애드온, AnimationPlayer, AnimationTree

FileSystem 독에서 모델을 클릭하고 Rig를 누르면 1분쯤 뒤 애니메이션이 들어간 리깅된 GLB가 옆에 생겨요. 걷기와 대기 애니메이션은 이미 반복 재생돼요.

AFK AI (dock)

Signed in as you@example.comSign out

3 of 3 rigs left this month.

Model: hero.glb

Body typeHuman

AnimationsAll animations

FacingAuto

Rig

Rigging...Cancel

Scene › hero_rigged
  • hero_riggedNode3D
  • └Skeleton3DSkeleton3D
  • └HeroMeshInstance3D
  • └AnimationPlayerAnimationPlayer
  • └Idle_Aloop ⟳
  • └Walkloop ⟳
  • └Jogloop ⟳
  • └Sprintloop ⟳
  • └…
스크린샷이 아니라 플러그인을 본떠 그린 그림이에요. hero.glb를 리깅하는 중인 AFK AI 독과, 그 옆에 저장된 리깅된 사본이에요. 애니메이션은 AnimationPlayer에 들어 있어요.

Godot는 애니메이션 재생에는 뛰어나지만 리그를 만들 방법은 없어요. 그래서 캐릭터 하나에도 보통 먼 길을 돌아가야 해요. 모델을 내보내고, Blender(휴머노이드라면 Mixamo)에서 리깅하고, 애니메이션을 찾고, GLB로 내보내고, 임포트한 뒤 반복 애니메이션마다 루프를 다시 설정해야 하죠.

AFK AI 애드온은 이 과정을 Godot 에디터의 독 하나에서 끝내요. FileSystem 독에서 모델을 클릭하고 Rig를 클릭하세요. 1분쯤 뒤 hero.glb 옆에 hero_rigged.glb가 저장돼요. 몸에 맞춰 만든 스켈레톤, 웨이트, AnimationPlayer에 담긴 애니메이션이 들어 있고, 대기, 걷기, 달리기 애니메이션은 이미 루프로 설정돼 있어요.

준비물

Godot
4.2 이상. 표준 빌드와 .NET 빌드 모두 돼요.
모델
프로젝트에 있는 .glb, .gltf, .fbx 파일, 최대 50 MB. .gltf는 모든 데이터가 한 파일에 들어 있어야 해요. 옆에 .bin이 있다면 대신 .glb로 내보내세요.
afk.ai 계정
Google로 무료로 만들 수 있어요. 리깅할 때마다 afk.ai/rig와 똑같이 계정의 그달 리깅 횟수가 1회 차감돼요.
인터넷
리깅은 afk.ai 서버에서 이루어져요. 고른 모델 파일만 전송돼요.

애드온 설치

  1. Godot 플러그인 페이지에서 애드온을 다운로드해요.
  2. 애드온의 addons/afk_ai 폴더를 프로젝트의 addons 폴더에 복사해요. 프로젝트에 addons 폴더가 없으면 만드세요.
  3. Project > Project Settings > Plugins를 열고 AFK AI 옆의 Enable에 체크해요.

오른쪽 Inspector 옆에 AFK AI 독이 생겨요.

모델 리깅하기

  1. 로그인. AFK AI 독에서 Sign in을 클릭해요. 브라우저에서 afk.ai가 열리면 Google로 로그인하세요. 독에 이메일과 이번 달 남은 리깅 횟수가 표시돼요. 브라우저가 Godot로 돌아오지 못하면 대신 로그인 코드가 표시돼요. I have a sign-in code 아래에 붙여 넣고 Use를 클릭하세요.
  2. 모델 고르기. FileSystem 독에서 모델 파일을 클릭해요.
  3. 옵션 고르기. Body type은 사람과 두 발로 서는 모델이라면 Human, 아니면 해당하는 동물이나 크리처를 골라요. Animations는 All animations, 스켈레톤만 받으려면 Rig only를 골라요. Facing은 Auto 그대로 두세요.
  4. Rig 클릭. 독에 업로드, 대기, 리깅, 다운로드 순으로 진행 상황이 표시돼요. 그동안 계속 작업하세요.

끝나면 hero.glb 옆에 hero_rigged.glb가 저장되고, 임포트된 뒤 선택된 상태가 돼요. 원본은 건드리지 않아요. 같은 모델을 다시 리깅하면 hero_rigged_2.glb가 생기니 아무것도 덮어쓰지 않아요.

리깅된 GLB에 들어 있는 것

hero_rigged.glb를 씬으로 끌어다 놓으면 바로 쓸 수 있어요. 모든 것이 하위에 들어간 노드 하나로 들어와요.

Skeleton3D
모델 유형에 맞춰 만든 스켈레톤에 메시가 스키닝되어 있어요. 사람은 손가락까지 모두 포함한 본 66개를 받고, 본 이름은 pelvis, spine_01, hand_r, foot_l 같은 식이에요.
AnimationPlayer
모든 애니메이션이 각자의 이름으로 들어 있어요. 휴머노이드는 최대 593개예요. Idle_A, Walk, Jog, Sprint, Jump_Start, Sword_Attack, Dance_Groove 말고도 수백 개가 있어요. 무료 계정은 무료 애니메이션을 받고, 요금제를 이용하면 나머지도 모두 받아요.
루프
대기, 걷기, 달리기, 비행, 수영 애니메이션은 이미 반복 재생돼요. Godot가 임포트하기 전에 애드온이 파일의 임포트 설정에 그렇게 적어 두거든요.
방향
GlTF 모델이 다 그렇듯 캐릭터는 +Z를 바라봐요.

AnimationPlayer로 애니메이션 재생하기

가장 간단한 플레이어 캐릭터는 CharacterBody3D에 CollisionShape3D(캡슐)를 붙이고, 리깅된 모델을 그 아래로 끌어다 놓은 뒤 이름을 Hero로 바꾼 구성이에요. CharacterBody3D에 다음 스크립트를 붙이세요:

extends CharacterBody3D

const SPEED := 4.0
var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity")

@onready var hero: Node3D = $Hero
@onready var anim: AnimationPlayer = $Hero/AnimationPlayer

func _physics_process(delta: float) -> void:
	var input := Input.get_vector("ui_left", "ui_right", "ui_up", "ui_down")
	var direction := Vector3(input.x, 0.0, input.y)
	velocity.x = direction.x * SPEED
	velocity.z = direction.z * SPEED
	if not is_on_floor():
		velocity.y -= gravity * delta
	move_and_slide()

	if direction.length() > 0.1:
		# the model faces +Z: turn that toward where it's going
		hero.rotation.y = lerp_angle(hero.rotation.y, atan2(direction.x, direction.z), 10.0 * delta)
		anim.play("Jog", 0.2)   # 0.2 s blend from whatever was playing
	else:
		anim.play("Idle_A", 0.2)

실행하면 방향키로 캐릭터가 조깅하며 돌아다니고, 키를 떼면 부드럽게 대기 동작으로 돌아가요. 이미 재생 중인 애니메이션으로 play를 호출하면 그대로 이어서 재생하니, 매 프레임 호출해도 괜찮아요.

AnimationTree로 블렌딩하기

AnimationTree는 속도에 따라 애니메이션을 블렌딩하고, 공격 같은 일회성 동작도 처리해요. 에디터에서 한 번만 설정하면 돼요:

  1. 캐릭터에 AnimationTree 노드를 추가해요. Inspector에서 Anim Player를 Hero/AnimationPlayer로, Tree Root를 새 AnimationNodeStateMachine으로 설정해요.
  2. 아래쪽 AnimationTree 패널에서 우클릭해 BlendSpace1D를 추가해요. 이름을 Locomotion으로 바꾸고 열어서 점 세 개를 추가해요. Idle_A는 0, Walk는 1.5, Jog는 4에 두세요(Max Space는 4로 설정).
  3. 다시 우클릭해 Sword_Attack 애니메이션을 추가해요. Start를 Locomotion에, Locomotion을 Sword_Attack에 연결하고, Sword_Attack에서 Locomotion으로 돌아가는 연결을 만들어 Switch Mode는 At End로, Advance Mode는 Auto로 설정해요.
  4. Project > Project Settings > Input Map에서 attack이라는 액션을 추가하고 키를 지정해요.

그다음 같은 스크립트에서 anim.play 두 줄을 지우고, 대신 트리를 제어하세요:

@onready var tree: AnimationTree = $AnimationTree
@onready var playback: AnimationNodeStateMachinePlayback = tree.get("parameters/playback")

func _process(_delta: float) -> void:
	tree.set("parameters/Locomotion/blend_position", Vector2(velocity.x, velocity.z).length())
	if Input.is_action_just_pressed("attack"):
		playback.travel("Sword_Attack")

AnimationTree가 활성화되어 있는 동안에는 AnimationTree가 애니메이션을 재생하니, AnimationPlayer의 play를 함께 호출하지 마세요.

StartLocomotionBlendSpace1D · Idle_A, Walk, Jog↓ travel("Sword_Attack")↑ At EndSword_Attack
그림: AnimationTree의 스테이트 머신. Locomotion은 속도에 따라 Idle_A, Walk, Jog를 블렌딩하고, travel()로 Sword_Attack에 갔다가 끝나면 돌아와요.

칼 쥐여 주기, 루프 바꾸기

캐릭터 손에 무언가를 쥐여 주려면 Skeleton3D를 선택하고 그 아래에 BoneAttachment3D를 추가해 Bone Name을 hand_r로 설정한 뒤, 칼을 그 어태치먼트 아래에 넣으세요. 어떤 애니메이션에서든 칼이 손을 따라가요.

반복할 애니메이션을 바꾸려면 FileSystem 독에서 hero_rigged.glb를 더블클릭해 Advanced Import Settings를 열어요. 왼쪽 AnimationPlayer 아래에서 애니메이션을 고르고 Loop Mode를 바꾼 뒤 Reimport를 클릭하세요.

동물, 크리처, 소품

Rig를 클릭하기 전에 독에서 모델 유형을 고르세요. 개, 고양이, 늑대는 Fox, 발굽 동물은 모두 Horse, 그 밖에 Bird, Dragon, 공룡은 Kaiju, Spider, Insect, Snake, Fish, Kangaroo, Frog, Turtle, Ghost, 소품은 Object예요. 유형마다 몸에 맞춰 만든 스켈레톤과 그 유형을 위한 애니메이션이 들어가요. 질주, 날갯짓, 포효, 헤엄, 스르륵 기어가기 같은 것들이에요. 재생은 똑같이 AnimationPlayer와 AnimationTree로 해요. 같은 모델 유형으로 리깅한 모델은 본과 애니메이션 이름이 모두 같아서, 늑대 하나에 만든 AnimationTree를 모든 늑대에 쓸 수 있어요. 유형별 애니메이션은 동물 가이드에 정리돼 있어요.

  • 드래곤
  • 네발 동물
  • 발굽 동물
  • 공룡
  • 거미
  • 물고기
다른 체형 6가지를 afk.ai/rig에서 리깅해 각자의 애니메이션을 재생한 모습.

리깅 횟수가 차감되는 경우

AFK AI에 도달한 리깅은 afk.ai/rig나 다른 AFK AI 플러그인에서와 똑같이 이번 달 리깅 횟수를 1회 차감해요. Cancel은 대기를 멈출 뿐 리깅을 멈추지는 않으니 횟수는 그대로 차감돼요. 실패한 리깅은 차감되지 않아요. 리깅 횟수를 다 쓰면 독에 그렇게 표시되고 See plans가 나타나요. 누르면 afk.ai 요금제가 열려요.

자주 묻는 질문

Godot에 자동 리깅 기능이 내장돼 있나요?

아니요. Godot는 이미 만들어진 스켈레톤과 애니메이션을 임포트하고, 리타기팅으로 휴머노이드 스켈레톤 하나를 다른 스켈레톤에 매핑할 수는 있지만, 메시를 리깅하지는 못해요. 그 부분을 AFK AI 애드온이 맡아서 Godot에 평범한 GLB를 넘겨줘요.

Godot 3에서도 작동하나요?

아니요. Godot 4.2 이상이 필요해요. Godot 3에서는 afk.ai/rig에서 모델을 리깅하고 다운로드한 GLB를 임포트하세요.

C# 프로젝트에서도 쓸 수 있나요?

네. 애드온은 GDScript로 되어 있고 Godot의 .NET 빌드도 GDScript를 실행하며, 리깅된 GLB는 어느 쪽이든 같아요. C#에서는 GetNode<AnimationPlayer>("Hero/AnimationPlayer").Play("Jog", 0.2);로 애니메이션을 재생해요.

왜 FBX가 아니라 GLB인가요?

GLB는 Godot가 가장 잘 임포트하는 형식이에요. 모든 Godot 4 버전에서 스켈레톤, 웨이트, 모든 애니메이션이 그대로 들어와요. 원본은 FBX여도 되고, 돌아오는 파일은 GLB예요.

애드온이 내보낸 게임에 포함되나요?

게임이 쓰는 것은 리깅된 GLB예요. 애드온 자체는 에디터에서만 작동해요. 애드온 파일을 내보내기에서 빼려면 내보내기 프리셋의 Resources 탭에서 addons/afk_ai/*를 제외하세요.

여러 모델을 한 번에 리깅할 수 있나요?

한 번에 하나씩, 각각 1분 정도 걸려요. 폴더 전체를 스크립트로 리깅하려면 리깅 API를 쓰세요. 똑같은 GLB를 만들어 줘요.

리깅된 캐릭터를 상업용 게임에 써도 되나요?

네. 스켈레톤과 애니메이션은 CC0이고, 모델은 계속 내 것이에요.

Blender, Unity, Unreal용 AFK AI 플러그인도 있나요?

네. Blender, Unity, Unreal Engine 가이드와, 앱 9종 전부를 다룬 AFK AI 플러그인 개요를 확인하세요.

내 모델 리깅하고 애니메이션 입히기

AI가 브라우저에서 리깅하고 나면, 수백 가지 애니메이션을 내 모델로 재생해 볼 수 있습니다. 어떤 엔진에서든 쓸 수 있는 GLB 하나로 다운로드하세요.

모델 리깅하기

다른 가이드