브리프유 브리프유 로그인
자청의 유튜브 추출기

유튜브 영상의 자막과 AI요약을 추출해보세요

AI 채팅

BETA

유니티 절차적 애니메이션: ⚡️무료 완벽 가이드! AAA급 연출 지금 바로 시작!

게시일: 작성자: 자청의 유튜브 추출기

AAA 게임 같은 인디 게임 만들기: 절차적 애니메이션으로 환경 상호작용 구현하기

이 튜토리얼에서는 AAA 게임에서 볼 수 있는 자연스러운 캐릭터 애니메이션을 인디 게임에서도 구현하는 방법을 배울 거야. 특히, 캐릭터가 주변 환경과 상호작용하는 방식을 절차적 애니메이션으로 만들어 볼 거야.

1. 절차적 애니메이션이란?

  • 키 프레임 애니메이션: 미리 만들어진 애니메이션으로, 항상 똑같이 재생돼. (예: 캐릭터가 걷는 모습)
  • 절차적 애니메이션: 게임이 실행되는 동안 특정 조건이나 값에 따라 동적으로 변하는 애니메이션이야. (예: 캐릭터가 벽에 손을 짚을 때, 벽과의 거리에 따라 손 위치가 달라지는 것)

2. 유니티 프로젝트 설정

  1. 애니메이션 리깅 패키지 설치: 유니티 패키지 매니저에서 'Animation Rigging' 패키지를 설치해. 이 패키지는 절차적 애니메이션을 쉽게 만들 수 있도록 도와줘.
  2. 캐릭터 뼈대 시각화:
    • 캐릭터 게임 오브젝트를 선택하고 'Animation Rigging' 메뉴에서 'Bone Render Setup'을 눌러.
    • 캐릭터의 뼈대(Armature)가 시각적으로 보이게 돼. 이걸로 어떤 뼈를 애니메이션할지 결정할 수 있어.
  3. 리그(Rig) 설정:
    • 캐릭터를 선택하고 'Animation Rigging' 메뉴에서 'Rig Setup'을 눌러.
    • 캐릭터에 'Rig Builder' 컴포넌트가 추가되고, 'Rig 1'이라는 자식 오브젝트가 생성돼. 이 'Rig 1'이 우리의 첫 번째 리그가 돼.
    • 리그는 뼈와 제약(Constraint)들의 모음이야. 제약은 뼈가 어떻게 움직이고 회전할지를 결정해.

3. 언차티드 4에서 배운 절차적 애니메이션 분석

  • 상황: 주인공 네이선 드레이크가 주변 환경에 손을 뻗어 짚을 때, 손이 벽을 뚫고 지나가지 않고 자연스럽게 위치가 조절되는 것을 볼 수 있었어.
  • 단계별 분석:
    1. 접근: 캐릭터가 상호작용 가능한 오브젝트(벽 등)에 가까워지면 절차적 애니메이션 시스템이 발동돼.
    2. 준비: 허리 높이 정도로 손을 들어 올려.
    3. 접촉: 어깨 높이 정도로 손을 더 높이 들어 올려 벽을 향해 뻗어.
    4. 지나감: 잠시 후 손 위치는 멈추고, 캐릭터 몸이 지나가기 시작해.
    5. 복귀: 손 위치가 원래 키 프레임 애니메이션 위치로 돌아가고, 절차적 애니메이션이 비활성화돼.
  • 애니메이션 중단 조건 (트리거):
    1. 캐릭터가 멈추면.
    2. 캐릭터가 벽에서 멀어지기 시작하면.
    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. 환경 상호작용 상태 머신 코딩

  1. EnvironmentInteractionStateMachine:
    • StateManager를 상속받고, EnvironmentInteractionState enum을 제네릭으로 사용해.
    • EnvironmentInteractionState enum: Search, Approach, Rise, Touch, Reset 상태를 정의해.
    • IK 제약, 회전 제약, 캐릭터의 Rigidbody, Collider 등을 참조할 SerializedField를 추가해.
    • ValidateConstraints 메서드로 필요한 컴포넌트들이 제대로 설정되었는지 확인해.
    • InitializeStates 메서드에서 각 상태를 생성하고, ResetState를 초기 상태로 설정해.
  2. EnvironmentInteractionContext:
    • 상태들이 공유할 데이터(IK 제약, 회전 제약, 현재 상호작용 중인 오브젝트, 캐릭터 속도 등)를 저장해.
    • SetCurrentSide 메서드로 캐릭터의 왼쪽 또는 오른쪽 중 어느 쪽 팔을 사용할지 결정해.
  3. EnvironmentInteractionState (추상 클래스):
    • BaseState를 상속받고, EnvironmentInteractionContext를 참조해.
    • GetClosestPointOnCollider 메서드로 충돌한 오브젝트에서 가장 가까운 지점을 계산해.
    • StartIKTargetPositionTracking, UpdateIKTargetPosition, ResetIKTargetPositionTracking 메서드를 정의해. 이 메서드들은 OnTriggerEnter, OnTriggerStay, OnTriggerExit 콜백에서 사용될 거야.
    • CheckShouldReset 메서드로 애니메이션을 중단해야 하는 조건들을 검사해.
  4. 구체적 상태 클래스 (SearchState, ApproachState, RiseState, TouchState, ResetState):
    • EnvironmentInteractionState를 상속받아 각 상태의 로직을 구현해.
    • EnterState, UpdateState, GetNextState 메서드에 각 상태에 맞는 동작을 코딩해.
    • ResetState: 절차적 애니메이션을 비활성화하고, 일정 시간 후 SearchState로 전환.
    • SearchState: 캐릭터가 상호작용 가능한 오브젝트에 가까워졌는지 감지.
    • ApproachState: 손을 허리 높이로 올리고, IK 제약의 가중치를 서서히 높여 애니메이션을 보이게 함. 손을 땅을 향하도록 회전시킴.
    • RiseState: 손을 더 높이 올리고, 손이 벽을 향하도록 회전시킴.
    • TouchState: 손을 벽에 댄 상태를 유지.
    • GetNextState: 각 상태에서 다음 상태로 전환될 조건을 검사.

8. 환경 감지 콜라이더 생성

  • EnvironmentInteractionStateMachineBox Collider를 추가해.
  • 이 콜라이더는 캐릭터 앞에 항상 위치하며, 상호작용 가능한 오브젝트를 감지하는 역할을 해.
  • IsTriggertrue로 설정해서 물리적인 충돌 없이 이벤트만 발생하도록 해.

9. 상태 전환 및 트리거 구현

  • 각 상태의 GetNextState 메서드에서 다음 상태로 전환될 조건을 검사해.
  • CheckShouldReset 메서드에서 캐릭터 멈춤, 멀어짐, 오브젝트 끝남, 각도 이상 등의 조건을 검사하여 ResetState로 전환되도록 해.

10. 최종 결과

이 모든 과정을 거치면, 캐릭터가 주변 환경과 자연스럽게 상호작용하는 절차적 애니메이션을 만들 수 있어. 마치 AAA 게임처럼 말이야!

핵심 요약:

  • 절차적 애니메이션: 동적으로 변하는 애니메이션.
  • 애니메이션 리깅: 절차적 애니메이션을 쉽게 만드는 유니티 패키지.
  • 상태 머신: 복잡한 애니메이션 로직을 관리하는 데 유용.
  • 2-Bone IK & Multi-Rotation Constraint: 팔과 손의 움직임과 회전을 제어.
  • 컨텍스트: 상태들이 공유하는 데이터를 저장.
  • 트리거: 애니메이션 중단 조건을 설정.

이 튜토리얼을 통해 절차적 애니메이션의 기본 원리를 이해하고, 자신만의 게임에 적용할 수 있을 거야!

최근 검색 기록