물리·애니메이션·타임라인

유니티 물리 · 애니메이션 · 타임라인: 움직임과 연출의 기술

목표: 본 장에서는 게임의 ‘움직임’을 구성하는 세 가지 핵심 기술 — 물리(Physics), 애니메이션(Animation), 타임라인(Timeline) — 을 다룹니다. 이 세 시스템은 단순히 시각적 효과가 아니라, 플레이어의 체감 경험서사적 연출을 완성하는 핵심 구성 요소입니다.

1. 물리 시스템 (Physics System)

유니티의 물리 시스템은 NVIDIA PhysX 엔진을 기반으로 하며, 현실 세계의 물리 법칙(중력, 충돌, 관성)을 시뮬레이션합니다. 게임에서 “실감 나는 반응”을 만드는 가장 직접적인 도구입니다.

1.1 기본 구성 요소

  • Rigidbody — 물리 시뮬레이션의 대상. 질량, 중력, 마찰 등의 영향을 받습니다.
  • Collider — 충돌 영역을 정의하는 형태(박스, 구, 메시 등).
  • Physics Material — 마찰력(Friction)과 반발력(Bounciness) 제어.
public class BallController : MonoBehaviour { public float force = 5f; private Rigidbody rb; void Start() { rb = GetComponent(); } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { rb.AddForce(Vector3.up * force, ForceMode.Impulse); } } }

위 코드는 Rigidbody에 힘을 가하여 점프하는 간단한 예제입니다. ForceMode.Impulse는 순간적인 힘을 적용할 때 사용됩니다.

1.2 물리 갱신 타이밍

물리 연산은 FixedUpdate()에서 수행됩니다. 이는 프레임 속도와 관계없이 일정한 간격으로 호출되므로, 물리 안정성이 유지됩니다.

void FixedUpdate() { rb.AddForce(Vector3.forward * 10f); }

1.3 충돌 이벤트

  • OnCollisionEnter() — 두 Collider가 충돌 시작할 때.
  • OnCollisionStay() — 충돌 중일 때.
  • OnCollisionExit() — 충돌이 끝날 때.
void OnCollisionEnter(Collision col) { Debug.Log("충돌한 객체: " + col.gameObject.name); }
⚙️ Tip: 실제 프로젝트에서는 물리 계산을 최소화해야 합니다. 많은 Rigidbody와 Collider는 CPU 병목을 일으킬 수 있으므로, Trigger ColliderRaycast를 대체적으로 활용하세요.

2. 애니메이션 시스템 (Animation System)

유니티의 애니메이션은 단순한 키프레임 시스템을 넘어서, Mecanim이라는 상태 기반 제어 시스템으로 구성됩니다. 이는 논리적 상태 전이(State Machine)를 통해 캐릭터의 모든 동작을 제어합니다.

2.1 Animator와 Animation Clip

  • Animator Component — 오브젝트의 애니메이션 제어 장치.
  • Animation Clip — 실제 움직임 데이터 파일 (예: Run, Jump, Idle).
  • Animator Controller — 여러 클립의 상태 전이(State) 정의.

Animator는 마치 “상태 그래프”처럼 구성되어 있으며, 각 동작을 조건에 따라 연결할 수 있습니다.

2.2 파라미터 기반 제어

Animator Controller는 파라미터를 사용하여 상태 전이를 제어합니다. 예를 들어, “isJumping”이 true일 때 Idle → Jump로 전환되도록 설정할 수 있습니다.

public class PlayerAnimator : MonoBehaviour { private Animator anim; void Start() { anim = GetComponent(); } void Update() { if (Input.GetKeyDown(KeyCode.Space)) { anim.SetBool("isJumping", true); } } }

Animator 파라미터는 SetBool(), SetTrigger(), SetFloat() 등의 함수로 제어할 수 있습니다.

2.3 Blend Tree (블렌드 트리)

여러 애니메이션을 부드럽게 전환하기 위해 Blend Tree를 사용합니다. 예를 들어, 속도에 따라 Idle → Walk → Run 애니메이션을 자연스럽게 보간할 수 있습니다.

💡 Tip: Blend Tree를 사용할 때는 Speed 파라미터를 기준으로 각 상태를 자연스럽게 연결하면 캐릭터의 움직임이 훨씬 부드러워집니다.

3. 타임라인 시스템 (Timeline System)

Timeline은 유니티의 시네마틱 연출 도구로, 애니메이션, 오디오, 카메라, 파티클 등의 타이밍을 한눈에 관리할 수 있습니다. Unity의 Timeline은 “비주얼 연출용 스크립트”라고 생각하면 이해하기 쉽습니다.

3.1 타임라인 기본 구조

  • Track — 각 자산(Animator, Audio, Camera 등)을 제어하는 트랙.
  • Clip — 트랙의 세그먼트 단위 (애니메이션, 사운드 구간 등).
  • Playable Director — 타임라인을 재생·정지시키는 컴포넌트.

3.2 타임라인 실행 예시

using UnityEngine; using UnityEngine.Playables;

public class CutsceneTrigger : MonoBehaviour {
public PlayableDirector timeline;
void OnTriggerEnter(Collider other) {
    if (other.CompareTag("Player")) {
        timeline.Play();
    }
}
}

이 코드는 플레이어가 특정 구역에 들어오면 컷신 타임라인을 자동 재생합니다. 즉, Timeline은 게임플레이의 자연스러운 흐름 안에 시네마틱을 삽입할 수 있게 합니다.

3.3 Timeline 확장

  • Signal — 특정 시점에 스크립트를 트리거 (예: 카메라 전환, 사운드 재생).
  • Cinemachine Track — 카메라 연출용 트랙.
  • Animation Track — 캐릭터 동작과 Cutscene을 동기화.
⚙️ 실무 팁: Timeline은 “플레이어 제어가 잠시 중단되는 순간”에 적합합니다. 컷신 이후에는 PlayableDirector.stopped 이벤트를 통해 자동으로 컨트롤을 복원할 수 있습니다.

4. 물리 + 애니메이션 + 타임라인의 통합

이 세 시스템은 각각 독립적으로 작동하지만, 정확한 타이밍과 상태 관리를 통해 유기적으로 결합할 수 있습니다.

  • 물리로 캐릭터의 움직임을 제어.
  • 애니메이션으로 시각적 반응을 보완.
  • 타임라인으로 이벤트 흐름을 연출.

예를 들어, “적이 플레이어를 발견 → 달려들기 → 컷신 전환 → 폭발 연출” 같은 시퀀스는 세 시스템의 조합으로 구현됩니다.

💡 통합 설계 원칙:
  • 물리와 애니메이션의 중복 제어를 피할 것.
  • Timeline은 “제어의 소유권”을 일시적으로 가져가는 구조임을 인식할 것.
  • 상태 머신(State Machine) 기반으로 전환 타이밍을 관리할 것.

정리: 움직임은 기술이 아니라 리듬이다

물리(Physics)는 세상의 법칙을, 애니메이션(Animation)은 생명감을, 타임라인(Timeline)은 시간을 설계합니다. 이 세 요소를 통합하는 순간, 게임은 단순한 반응형 시스템이 아니라 살아 있는 리듬으로 작동하게 됩니다.

즉, 좋은 움직임은 “보이는 것”이 아니라 “느껴지는 것”입니다.

다음 학습 추천:

Comments