콘텐츠로 이동

Unity Cinemachine & Timeline 연동

Cinemachine은 Unity의 프로시저럴 카메라 시스템입니다. 물리 기반 카메라 이동, 타겟 추적, 카메라 전환 블렌딩을 코드 없이 설정할 수 있으며, Timeline과 결합하면 영화적 연출이 가능합니다.

핵심 구성 요소:

  • CinemachineBrain: 메인 카메라에 붙이는 제어 컴포넌트
  • CinemachineVirtualCamera: 가상 카메라 (실제 렌더링 없음)
  • CinemachineFreeLook: 3인칭 궤도 카메라
  • CinemachineStateDrivenCamera: 애니메이터 상태 연동 카메라

using Cinemachine;
using UnityEngine;
public class CameraController : MonoBehaviour
{
[SerializeField] private CinemachineVirtualCamera _followCam;
[SerializeField] private CinemachineVirtualCamera _aimCam;
[SerializeField] private Transform _player;
void Start()
{
// Follow: 카메라가 따라갈 타겟
_followCam.Follow = _player;
// LookAt: 카메라가 바라볼 타겟
_followCam.LookAt = _player;
// Priority: 높은 값의 Virtual Camera가 활성화됨
_followCam.Priority = 10;
_aimCam.Priority = 0;
}
// 조준 모드: aimCam 활성화
public void EnterAimMode()
{
_aimCam.Priority = 20; // followCam(10)보다 높게
}
public void ExitAimMode()
{
_aimCam.Priority = 0;
}
}

void ConfigureCamera()
{
var vcam = GetComponent<CinemachineVirtualCamera>();
// Body: Transposer — 카메라 위치 제어
var transposer = vcam.GetCinemachineComponent<CinemachineTransposer>();
if (transposer != null)
{
transposer.m_FollowOffset = new Vector3(0, 2f, -5f);
transposer.m_XDamping = 1f; // 수평 댐핑
transposer.m_YDamping = 1f; // 수직 댐핑
transposer.m_ZDamping = 1f; // 깊이 댐핑
}
// Aim: Composer — 카메라 회전 제어
var composer = vcam.GetCinemachineComponent<CinemachineComposer>();
if (composer != null)
{
composer.m_TrackedObjectOffset = new Vector3(0, 1.6f, 0); // 머리 높이
composer.m_HorizontalDamping = 0.5f;
composer.m_VerticalDamping = 0.5f;
composer.m_ScreenX = 0.5f; // 화면 중앙 X
composer.m_ScreenY = 0.45f; // 화면 중앙 Y
}
}

public class ThirdPersonCamera : MonoBehaviour
{
[SerializeField] private CinemachineFreeLook _freeLook;
void Start()
{
_freeLook.Follow = GameObject.FindWithTag("Player").transform;
_freeLook.LookAt = GameObject.FindWithTag("Player").transform;
// 세 개의 궤도 설정 (Top / Middle / Bottom)
_freeLook.m_Orbits[0] = new CinemachineFreeLook.Orbit { m_Height = 4f, m_Radius = 2f };
_freeLook.m_Orbits[1] = new CinemachineFreeLook.Orbit { m_Height = 2f, m_Radius = 4f };
_freeLook.m_Orbits[2] = new CinemachineFreeLook.Orbit { m_Height = 0f, m_Radius = 2f };
// 입력 축 설정
_freeLook.m_XAxis.m_InputAxisName = "Mouse X";
_freeLook.m_YAxis.m_InputAxisName = "Mouse Y";
_freeLook.m_XAxis.m_MaxSpeed = 300f;
_freeLook.m_YAxis.m_MaxSpeed = 2f;
}
}

using Cinemachine;
public class CameraShaker : MonoBehaviour
{
[SerializeField] private CinemachineImpulseSource _impulseSource;
// 폭발, 착지 등 충격 효과
public void ShakeOnExplosion(float force)
{
_impulseSource.GenerateImpulse(force);
}
// 방향성 있는 충격
public void ShakeDirectional(Vector3 direction, float force)
{
_impulseSource.GenerateImpulseWithVelocity(direction * force);
}
}
// CinemachineVirtualCamera에 CinemachineImpulseListener 컴포넌트 추가 필요

Timeline을 사용해 컷씬을 제작합니다.

using UnityEngine;
using UnityEngine.Playables;
using UnityEngine.Timeline;
using Cinemachine;
public class CutsceneManager : MonoBehaviour
{
[SerializeField] private PlayableDirector _director;
[SerializeField] private CinemachineVirtualCamera _cutsceneCam;
[SerializeField] private CinemachineVirtualCamera _gameCam;
// 컷씬 시작
public void PlayCutscene()
{
// 게임 카메라 비활성화
_gameCam.Priority = 0;
// 컷씬 카메라 활성화
_cutsceneCam.Priority = 100;
// 플레이어 입력 비활성화
// PlayerInput.Instance.Disable();
_director.Play();
_director.stopped += OnCutsceneStopped;
}
private void OnCutsceneStopped(PlayableDirector director)
{
_director.stopped -= OnCutsceneStopped;
// 게임 카메라 복원
_cutsceneCam.Priority = 0;
_gameCam.Priority = 10;
// 플레이어 입력 재활성화
// PlayerInput.Instance.Enable();
}
}

Timeline 창에서 다음 트랙들을 추가합니다.

Timeline
├── Cinemachine Track → CinemachineBrain 바인딩
│ ├── Virtual Camera Shot (vcam1) — 0s~2s
│ ├── Virtual Camera Shot (vcam2) — 2s~4s (블렌드 0.5s)
│ └── Virtual Camera Shot (vcam3) — 4s~7s
├── Animation Track → 캐릭터 애니메이션
├── Audio Track → 배경음악, 음성
└── Signal Track → 컷씬 이벤트 트리거

// 런타임에 Timeline의 Cinemachine Shot 클립 제어
using UnityEngine.Timeline;
public class DynamicCutscene : MonoBehaviour
{
[SerializeField] private PlayableDirector _director;
// 특정 Virtual Camera로 즉시 전환
public void SwitchToCamera(CinemachineVirtualCamera vcam, float blendTime)
{
// CinemachineBrain의 기본 블렌드 설정 변경
var brain = Camera.main.GetComponent<CinemachineBrain>();
brain.m_DefaultBlend = new CinemachineBlendDefinition(
CinemachineBlendDefinition.Style.EaseInOut,
blendTime
);
// Priority 전환으로 카메라 변경
vcam.Priority = 100;
}
}

컴포넌트역할
CinemachineBrain메인 카메라 제어, Virtual Camera 선택
CinemachineVirtualCamera개별 카메라 설정 (위치, 회전, FOV)
CinemachineFreeLook3인칭 궤도 카메라
CinemachineTransposer카메라 위치 추적 방식
CinemachineComposer카메라 조준 방식
CinemachineImpulse카메라 진동 효과
Cinemachine TrackTimeline에서 카메라 전환

Cinemachine과 Timeline의 조합은 Unity에서 영화 수준의 카메라 연출을 코드 최소화로 구현할 수 있는 강력한 도구입니다.