유니티 절차적 애니메이션: ⚡️무료 완벽 가이드! AAA급 연출 지금 바로 시작!
게시일:
작성자: 자청의 유튜브 추출기
AAA 게임 같은 인디 게임 만들기: 절차적 애니메이션으로 환경 상호작용 구현하기
이 튜토리얼에서는 AAA 게임에서 볼 수 있는 자연스러운 캐릭터 애니메이션을 인디 게임에서도 구현하는 방법을 배울 거야. 특히, 캐릭터가 주변 환경과 상호작용하는 방식을 절차적 애니메이션으로 만들어 볼 거야.
1. 절차적 애니메이션이란?
- 키 프레임 애니메이션: 미리 만들어진 애니메이션으로, 항상 똑같이 재생돼. (예: 캐릭터가 걷는 모습)
- 절차적 애니메이션: 게임이 실행되는 동안 특정 조건이나 값에 따라 동적으로 변하는 애니메이션이야. (예: 캐릭터가 벽에 손을 짚을 때, 벽과의 거리에 따라 손 위치가 달라지는 것)
2. 유니티 프로젝트 설정
- 애니메이션 리깅 패키지 설치: 유니티 패키지 매니저에서 'Animation Rigging' 패키지를 설치해. 이 패키지는 절차적 애니메이션을 쉽게 만들 수 있도록 도와줘.
- 캐릭터 뼈대 시각화:
- 캐릭터 게임 오브젝트를 선택하고 'Animation Rigging' 메뉴에서 'Bone Render Setup'을 눌러.
- 캐릭터의 뼈대(Armature)가 시각적으로 보이게 돼. 이걸로 어떤 뼈를 애니메이션할지 결정할 수 있어.
- 리그(Rig) 설정:
- 캐릭터를 선택하고 'Animation Rigging' 메뉴에서 'Rig Setup'을 눌러.
- 캐릭터에 'Rig Builder' 컴포넌트가 추가되고, 'Rig 1'이라는 자식 오브젝트가 생성돼. 이 'Rig 1'이 우리의 첫 번째 리그가 돼.
- 리그는 뼈와 제약(Constraint)들의 모음이야. 제약은 뼈가 어떻게 움직이고 회전할지를 결정해.
3. 언차티드 4에서 배운 절차적 애니메이션 분석
- 상황: 주인공 네이선 드레이크가 주변 환경에 손을 뻗어 짚을 때, 손이 벽을 뚫고 지나가지 않고 자연스럽게 위치가 조절되는 것을 볼 수 있었어.
- 단계별 분석:
- 접근: 캐릭터가 상호작용 가능한 오브젝트(벽 등)에 가까워지면 절차적 애니메이션 시스템이 발동돼.
- 준비: 허리 높이 정도로 손을 들어 올려.
- 접촉: 어깨 높이 정도로 손을 더 높이 들어 올려 벽을 향해 뻗어.
- 지나감: 잠시 후 손 위치는 멈추고, 캐릭터 몸이 지나가기 시작해.
- 복귀: 손 위치가 원래 키 프레임 애니메이션 위치로 돌아가고, 절차적 애니메이션이 비활성화돼.
- 애니메이션 중단 조건 (트리거):
- 캐릭터가 멈추면.
- 캐릭터가 벽에서 멀어지기 시작하면.
- 상호작용할 벽이 끝나면.
- 캐릭터와 벽의 각도가 이상해지면 (예: 팔이 몸을 가로질러 뻗는 경우).
4. 상태 패턴과 상태 머신
복잡한 애니메이션 로직을 관리하기 위해 상태 패턴(State Pattern)과 상태 머신(State Machine)을 사용해.
- 상태 패턴: 각 상태별 로직을 분리해서 관리하는 디자인 패턴이야.
- 상태 머신: 여러 상태를 정의하고, 상태 간 전환을 관리하는 시스템이야.
환경 상호작용 상태 머신 구성:
- 추상 클래스:
BaseState,StateManager,EnvironmentInteractionState - 구체적 상태 클래스:
SearchState,ApproachState,RiseState,TouchState,ResetState - 컨텍스트 클래스:
EnvironmentInteractionContext(상태들이 공유할 데이터 저장) - 구체적 상태 관리 클래스:
EnvironmentInteractionStateMachine
5. 재사용 가능한 상태 머신 만들기
BaseState(추상 클래스):- 각 상태가 가져야 할 메서드(예:
EnterState,ExitState,UpdateState,GetNextState)를 정의해. GetNextState는 어떤 상태로 전환될지를 알려주는 역할을 해.- 제네릭(Generics):
T State와 같이 타입을 미리 정하지 않고 나중에 결정할 수 있게 해서 코드 재사용성을 높여.where T : Enum과 같이 제약 조건을 걸 수도 있어.
- 각 상태가 가져야 할 메서드(예:
StateManager(추상 클래스):- 상태 머신의 핵심 역할을 해. 현재 상태를 관리하고, 상태 전환을 처리해.
MonoBehaviour를 상속받아 유니티 생명주기 메서드(Awake, Update 등)를 사용할 수 있어.- 상태들을
Dictionary에 저장하고 관리해. TransitionToState메서드로 상태를 전환해.
6. 절차적 애니메이션을 위한 리그 설정 (2-Bone IK)
EnvironmentInteractionRig: 캐릭터의 팔과 손을 제어하기 위한 리그야.Two Bone IK Constraint: 팔과 같은 두 개의 뼈로 이루어진 관절을 제어하는 데 사용돼.- Tip: 팔의 끝 (손)
- Mid: 팔꿈치
- Root: 어깨
- Target: IK가 움직일 목표 지점
- Hint: 팔이 구부러지는 방향을 지정
Multi-Rotation Constraint: 손의 회전을 제어하는 데 사용돼. IK Target의 회전을 따라가도록 설정해.- Offset 설정: 손이 자연스럽게 보이도록 회전 오프셋을 조정해야 해.
7. 환경 상호작용 상태 머신 코딩
EnvironmentInteractionStateMachine:StateManager를 상속받고,EnvironmentInteractionStateenum을 제네릭으로 사용해.EnvironmentInteractionStateenum:Search,Approach,Rise,Touch,Reset상태를 정의해.- IK 제약, 회전 제약, 캐릭터의 Rigidbody, Collider 등을 참조할
SerializedField를 추가해. ValidateConstraints메서드로 필요한 컴포넌트들이 제대로 설정되었는지 확인해.InitializeStates메서드에서 각 상태를 생성하고,ResetState를 초기 상태로 설정해.
EnvironmentInteractionContext:- 상태들이 공유할 데이터(IK 제약, 회전 제약, 현재 상호작용 중인 오브젝트, 캐릭터 속도 등)를 저장해.
SetCurrentSide메서드로 캐릭터의 왼쪽 또는 오른쪽 중 어느 쪽 팔을 사용할지 결정해.
EnvironmentInteractionState(추상 클래스):BaseState를 상속받고,EnvironmentInteractionContext를 참조해.GetClosestPointOnCollider메서드로 충돌한 오브젝트에서 가장 가까운 지점을 계산해.StartIKTargetPositionTracking,UpdateIKTargetPosition,ResetIKTargetPositionTracking메서드를 정의해. 이 메서드들은OnTriggerEnter,OnTriggerStay,OnTriggerExit콜백에서 사용될 거야.CheckShouldReset메서드로 애니메이션을 중단해야 하는 조건들을 검사해.
- 구체적 상태 클래스 (
SearchState,ApproachState,RiseState,TouchState,ResetState):EnvironmentInteractionState를 상속받아 각 상태의 로직을 구현해.EnterState,UpdateState,GetNextState메서드에 각 상태에 맞는 동작을 코딩해.ResetState: 절차적 애니메이션을 비활성화하고, 일정 시간 후SearchState로 전환.SearchState: 캐릭터가 상호작용 가능한 오브젝트에 가까워졌는지 감지.ApproachState: 손을 허리 높이로 올리고, IK 제약의 가중치를 서서히 높여 애니메이션을 보이게 함. 손을 땅을 향하도록 회전시킴.RiseState: 손을 더 높이 올리고, 손이 벽을 향하도록 회전시킴.TouchState: 손을 벽에 댄 상태를 유지.GetNextState: 각 상태에서 다음 상태로 전환될 조건을 검사.
8. 환경 감지 콜라이더 생성
EnvironmentInteractionStateMachine에 Box Collider를 추가해.- 이 콜라이더는 캐릭터 앞에 항상 위치하며, 상호작용 가능한 오브젝트를 감지하는 역할을 해.
IsTrigger를true로 설정해서 물리적인 충돌 없이 이벤트만 발생하도록 해.
9. 상태 전환 및 트리거 구현
- 각 상태의
GetNextState메서드에서 다음 상태로 전환될 조건을 검사해. CheckShouldReset메서드에서 캐릭터 멈춤, 멀어짐, 오브젝트 끝남, 각도 이상 등의 조건을 검사하여ResetState로 전환되도록 해.
10. 최종 결과
이 모든 과정을 거치면, 캐릭터가 주변 환경과 자연스럽게 상호작용하는 절차적 애니메이션을 만들 수 있어. 마치 AAA 게임처럼 말이야!
핵심 요약:
- 절차적 애니메이션: 동적으로 변하는 애니메이션.
- 애니메이션 리깅: 절차적 애니메이션을 쉽게 만드는 유니티 패키지.
- 상태 머신: 복잡한 애니메이션 로직을 관리하는 데 유용.
- 2-Bone IK & Multi-Rotation Constraint: 팔과 손의 움직임과 회전을 제어.
- 컨텍스트: 상태들이 공유하는 데이터를 저장.
- 트리거: 애니메이션 중단 조건을 설정.
이 튜토리얼을 통해 절차적 애니메이션의 기본 원리를 이해하고, 자신만의 게임에 적용할 수 있을 거야!