"시네머신(Cinemachine)"
개발을 하다 보면 카메라가 플레이어를 따라오게 만드는 것 자체는 어렵진 않다.
하지만 흔들림, 컷씬, 조준/줌, 충돌 처리처럼 카메라가 ‘연출’을 해야 하는 순간이 온다.
처음에는 'Camera.transform...' 같은 코드로도 간단히 해결할 수 있다.
다만 기능이 늘어날수록 코드가 복잡해지고, 결국 카메라가 시네마틱하게 움직여야 하는데
이때 가장 많이 쓰는 도구가 시네머신(Cinemachine)이다.
시네머신은 타겟 추적, 구도(프레이밍), 샷 전환/블렌딩 같은 카메라 로직을 모듈 형태로 제공하는 패키지로,
카메라 연출에 들어가는 수학/로직 부담을 크게 줄여준다.
그래서 오늘은 시네머신이 무엇인지 간단히 정리하고,
시네머신을 이용한 실습을 진행해 볼 예정이다.
1) Cinemachine이란?
시네머신(Cinemachine)은 여러 ‘가상 카메라(샷)’를 만들어두고,
Brain이 상황에 맞는 카메라를 선택/블렌딩하여 실제 카메라를 자동으로 움직이게 하는 시스템
Main Camera + Cinemachine Brain이 실제 렌더 카메라 역할을 하고,
여러 개의 CinemachineCamera를 만들고 필요할 때 바꿔가며 연출한다.

2) 시네머신의 핵심 구성은?
Main Camera
실제 렌더링 담당
Cinemachine Brain
어떤 가상 카메라를 활성할 지 선택 + 전환(Blend) 처리
Cinemachine Camera(가상 카메라)
Follow/LookAt/구도/줌/흔들림 등 '샷의 규칙'을 정의
3) 시네머신 실습해보기
a. 오브젝트 준비

Plane 생성 후 Ground로 이름 변경

빈 오브젝트에 Player로 사용할 캐릭터 프리팹 만들어서 넣어주기

Player 자식으로 빈 오브젝트 생성 후,
CameraTarget로 이름 변경 및 Position을 (0, 1.6, 0) 정도로 변경
(머리 기준 타겟(Cinemachine-Look At)으로 사용할 예정)
b. 시네머신 설치

Window - Package Manager 클릭

Packages: Unity Registry에서 Cinemachine 검색 및 인스톨
c. Cinemachine 카메라 세팅

MainCamera - Cinemachine Brain 컴포넌트 추가

GameObject > Cinemachine > FreeLook Camera 생성
**Virtual Camera(VCam): 범용 가상 카메라
Body/Aim/Noise 파이프라인을 조합해서 어떤 카메라도 만들 수 있음.
**FreeLook: 3인칭 전용 오비트(공전) 카메라
타깃 주위를 3개의 리그(Top/Mid/Bottom)로 둘러싸며 공전하는 프리셋/매니저 카메라.
(3인칭 게임에서 캐릭터 중심 + 마우스로 공전이 기본인 카메라
또는 상/중/하 시점(높이 변화)이 자연스럽게 필요할 때 사용)

FreeLook 오브젝트에서
Follow = Player, Look At = CameraTarget로 설정

마우스 시야 회전 입력 연결 확인
X Axis
Input Axis Name: Mouse X
Y Axis
Input Axis Name: Mouse Y
d. 플레이어 이동 스크립트 만들기(카메라 기준)
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class PlayerMover : MonoBehaviour
{
public float moveSpeed = 4.5f;
public float dashMultiplier = 1.8f;
public float turnSpeed = 12f;
CharacterController cc;
void Awake()
{
cc = GetComponent<CharacterController>();
}
void Update()
{
float h = Input.GetAxisRaw("Horizontal");
float v = Input.GetAxisRaw("Vertical");
Transform cam = Camera.main != null ? Camera.main.transform : null;
Vector3 camForward = cam ? cam.forward : Vector3.forward;
Vector3 camRight = cam ? cam.right : Vector3.right;
camForward.y = 0; camRight.y = 0;
camForward.Normalize();
camRight.Normalize();
Vector3 dir = (camForward * v + camRight * h);
if (dir.sqrMagnitude > 1f) dir.Normalize();
float speed = moveSpeed * (Input.GetKey(KeyCode.LeftShift) ? dashMultiplier : 1f);
cc.SimpleMove(dir * speed);
if (dir.sqrMagnitude > 0.0001f)
{
Quaternion targetRot = Quaternion.LookRotation(dir, Vector3.up);
transform.rotation = Quaternion.Slerp(transform.rotation, targetRot, 1 - Mathf.Exp(-turnSpeed * Time.deltaTime));
}
}
}
PlayerMover.cs
(Player에 부착)
e. 우클릭 줌인/줌아웃 토글 스크립트 만들기
using UnityEngine;
using Cinemachine;
public class FreeLookZoomToggle : MonoBehaviour
{
public float zoomFov = 35f; // 줌인 FOV
public float smooth = 12f; // 보간 속도
CinemachineFreeLook freeLook;
float normalFov;
bool zoomed;
void Awake()
{
freeLook = GetComponent<CinemachineFreeLook>();
normalFov = freeLook.m_Lens.FieldOfView; // 기본 FOV 저장
}
void Update()
{
// 우클릭 토글
if (Input.GetMouseButtonDown(1))
zoomed = !zoomed;
float target = zoomed ? zoomFov : normalFov;
var lens = freeLook.m_Lens;
float t = 1f - Mathf.Exp(-smooth * Time.deltaTime);
lens.FieldOfView = Mathf.Lerp(lens.FieldOfView, target, t);
freeLook.m_Lens = lens;
}
}
FreeLookZoomToggle.cs
(FreeLook에 부착)
4) 실습 결과

5) 오늘의 한 줄 요약
『 시네머신(Cinemachine)은 여러 ‘가상 카메라’ 중 상황에 맞는 샷을 선택해,
실제 Main Camera를 자동으로 구동하는 카메라 시스템이다. 』
'1일 1 cs' 카테고리의 다른 글
| 22. 박싱(Boxing)과 언박싱(Unboxing)이란? (0) | 2026.02.08 |
|---|---|
| 21. namespace와 partial 이란? (0) | 2026.02.07 |
| 19. API (Application Programming Interface) 란? (0) | 2026.02.04 |
| 18. 이진 트리 순회(Traversal)란? (0) | 2026.02.02 |
| 17. 깊이 우선 탐색(DFS)과 너비 우선 탐색(BFS)이란? (0) | 2026.02.01 |