Unity Cinemachine & Timeline 연동
Cinemachine 개요
섹션 제목: “Cinemachine 개요”Cinemachine은 Unity의 프로시저럴 카메라 시스템입니다. 물리 기반 카메라 이동, 타겟 추적, 카메라 전환 블렌딩을 코드 없이 설정할 수 있으며, Timeline과 결합하면 영화적 연출이 가능합니다.
핵심 구성 요소:
CinemachineBrain: 메인 카메라에 붙이는 제어 컴포넌트CinemachineVirtualCamera: 가상 카메라 (실제 렌더링 없음)CinemachineFreeLook: 3인칭 궤도 카메라CinemachineStateDrivenCamera: 애니메이터 상태 연동 카메라
Virtual Camera 기본 설정
섹션 제목: “Virtual Camera 기본 설정”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; }}Transposer와 Composer 설정 (코드)
섹션 제목: “Transposer와 Composer 설정 (코드)”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 }}CinemachineFreeLook — 3인칭 카메라
섹션 제목: “CinemachineFreeLook — 3인칭 카메라”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; }}Impulse — 카메라 진동 효과
섹션 제목: “Impulse — 카메라 진동 효과”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과 Cinemachine 연동
섹션 제목: “Timeline과 Cinemachine 연동”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 트랙 구성”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 → 컷씬 이벤트 트리거CinemachineCamera Shot 코드 제어
섹션 제목: “CinemachineCamera Shot 코드 제어”// 런타임에 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) |
CinemachineFreeLook | 3인칭 궤도 카메라 |
CinemachineTransposer | 카메라 위치 추적 방식 |
CinemachineComposer | 카메라 조준 방식 |
CinemachineImpulse | 카메라 진동 효과 |
Cinemachine Track | Timeline에서 카메라 전환 |
Cinemachine과 Timeline의 조합은 Unity에서 영화 수준의 카메라 연출을 코드 최소화로 구현할 수 있는 강력한 도구입니다.