(주말 공부)XR플밍 - (15) Cinemachine (5/10)

이형원·2025년 5월 10일
0

XR플밍

목록 보기
69/214

1. Cinemachine이란?

지금까지 우리는 카메라를 수동으로 제어해서 사용해왔다. 하지만 유니티에서는 여러 카메라 연출 기법들을 보다 손쉽게 개발할 수 있는 카메라 툴을 지원하며, 이를 Cinemachine이라고 한다.

시네머신을 사용하면 게임 내 컷신 뿐만 아니라 개발자가 직접 구현했어야 하는 복잡한 카메라의 전환이나 무빙을 비교적 쉽고 빠르게 구현할 수 있다. 이를 이용해 시네마틱 컷신 등 퀄리티 높은 결과물을 제작할 때 유용하게 사용될 수 있다.

2. Cinemachine의 기본 세팅

유니티 패키지 매니저에서 Cinemachine을 찾아서 다운받아보자.

시네머신은 유니티에서 지원하는 에셋으로 별도의 에셋스토어 다운로드 대신 com.unity.cinemachine을 검색하는 것으로 다운받을 수 있다.

버전은 Recommended로 되어 있던 2.10.3 버전으로 업데이트하고 사용했다.
(초기에는 3.1.3 버전으로 다운받아졌으나, 이건 프리팹이 다 깨져 있는 등 문제가 있어서 사용할 수 없었다.)

여기에 있는 샘플씬을 다운받고 아래와 같이 프리팹으로 세팅을 하여 각 기능을 알아보기로 했다.

3. Virtual Camera

시네머신의 가장 기본적인 요소인 가상 카메라이다. 가상 카메라는 실제 카메라가 아니라 카메라를 제어할 Transform 정보와 주시대상 등에 대한 정보를 가지고 있는 컴포넌트로 구성된 오브젝트이다.
때문에, 가상 카메라를 사용하는 것은 직접적으로 카메라를 추가하는 방법과 비교했을 때, 성능상의 이득을 볼 수 있다.

시네머신 탭의 가상카메라를 추가해준다.

비교를 위해 가상카메라를 두 개 만들었으며, 하나는 플레이어를 따라다니면서 플레이어를 바라보게 하고, 하나는 플레이어를 고정된 위치에서 바라보게 했다.
이제 이 가상카메라를 전환하기 위한 스크립트를 작성해보고자 한다.

using UnityEngine;
using UnityEngine.UI;
using Cinemachine;

public class CamChangeManager : MonoBehaviour
{
    [SerializeField] private CinemachineVirtualCamera[] cameras;
    [SerializeField] private Button[] buttons;

    private void OnEnable()
    {
        buttons[0].onClick.AddListener(FirstCamOn);
        buttons[1].onClick.AddListener(SecondCamOn);
    }

    private void FirstCamOn()
    {
    	// 카메라의 우선순위를 변경하여 출력할 가상 카메라를 전환
        cameras[0].Priority = 11;
    }

    private void SecondCamOn()
    {
    	// 카메라의 우선순위를 변경하여 출력할 가상 카메라를 전환
        cameras[0].Priority = 9;
    }

    private void OnDisable()
    {
        buttons[0].onClick.RemoveListener(FirstCamOn);
        buttons[1].onClick.RemoveListener(SecondCamOn);
    }
}

이와 같이 설정하고 버튼 두 개를 만든 후 빈 오브젝트로 CamChangeManager를 만든 후 세팅해본다.

각도 세팅을 뭔가 이상하게 해서 참 이상하게 카메라가 출력되기는 하지만, 우선은 정상 작동하는 것이다.

Main 카메라에서 Blend 시간을 조절하여 카메라의 전환 속도도 조절할 수 있다.

또한 각 가상카메라의 출력이 부자연스러울 경우 body를 조절하여 전환 속도를 조절해 카메라의 이동속도를 부드럽게 만들 수도 있다.

4. Blend List

전환 될 가상카메라들에 대한 정보를 지니고 있는 가상 카메라 그룹이다. 개별 카메라로 넘어가는 과정과 시간을 제어할 수 있다.

블랜드 리스트 카메라로 생성할 수 있으며, 이와 같이 생성하면 가상카메라가 리스트 형태로 카메라를 만들 수 있다.

다양한 옵션 세팅을 할 수 있으며 카메라 시점 대상을 설정할 경우, 해당 블렌드 리스트의 자식 오브젝트에 일괄 적용된다.

Blend in의 각 효과는 아래와 같다. 유니티 공식 메뉴얼에서 확인할 수 있다.

5. Clear Shot

여러 대의 가상 카메라를 대기시키고 주시해야 할 오브젝트가 다른 오브젝트(벽, 지형)등에 가려졌을 때 주시대상을 볼 수 있는 카메라로 자동 전환한다.

사용해 보기 위해 장애물이 있는 맵으로 씬을 준비한다.

클리어샷 카메라의 시야 전환을 위해 가상카메라를 하나 더 만든 후 적절한 위치에 배치한다. 그 다음으로 장애물로 판정할 Layer를 만든 후 해당 장애물에 Layer를 지정한다.

시네머신 충돌체라는 컴포넌트에서 Obstacle를 탐지할 수 있도록 설정하고 대상 오브젝트를 연결시킨다.

블랜드를 통해서 효과를 줄 수도 있다.

이를 테스트하면 다음과 같이 나온다.

다만 사용 시 유의해야 할 점은, 장애물에 Layer 설정이 안 되어 있거나 카메라가 처음부터 시야가 가려져 있을 경우 제대로 작동하지 않을 수 있다.

6. Dolly Cam

가상의 트랙을 지정하고, 카메라가 지정 트랙 위에서만 움직이도록 제어할 수 있다. 이 가상의 트랙은 일반 오브젝트에도 적용할 수 있으며, 지정된 경로를 반복적으로 움직이게 해야할 때 용이하다.

6.1 Dolly Camera with Track

Dolly Camera with Track을 생성해준다.

그러면 이렇게 카메라와 함께 트랙이 그려지는 것을 확인할 수 있다.
(기즈모 체크를 해 두자. 기즈모 체크를 안 해 두면 트랙이 안 보인다.)

Dolly Camera를 사용하기 위해선 가상 카메라의 Body가 Tracked Dooly로 되어 있고, Path가 트랙으로 되어 있는지 확인해보자.

Dolly Track에서 경로를 설정하여 만들어보자. 이와 같이 원형 트랙도 만들 수 있다.

Follw와 LookAt을 설정해 주고, Auto Dolly를 체크하여 카메라가 플레이어를 따라가도록 해 준다.

이와 같이 카메라가 트랙을 따라 플레이어를 따라가는 것을 확인할 수 있다.

6.2 Dolly Track with Cart

위의 기능과 달리 Dolly Track with Cart는 트랙과 카트만 생성을 한다.

우선 Dolly Track with Cart를 생성하고 가상 카메라를 생성해주자.

가상 카메라의 Follw를 Dolly Cart로, LookAt은 플레이어로, Dolly Track을 경로로 설정하고 Auto Dolly를 체크해보자.

이와 같이 카메라는 Dolly Cart를 따라 돌면서 플레이어를 바라보게 할 수 있다.

Dolly Track with Car가 활용도가 더 높으며, 트랙에 오브젝트로 달고 움직이게 할 수 있다는 특성이 있다.
(해당 오브젝트를 카트의 자식 오브젝트로 부착 시 가능)

7. Free Look

주시 대상에 대한 자유로운 시점 변환이 가능하다. Top, Middle, Bottom 시점을 각자 다른 위치를 조절할 수 있어 캐릭터를 클로즈업 하는 TPS 시점을 구현하기 용이하다.

프리 룩 카메라를 만들어보자.

카메라의 Follow를 플레이어로 설정한다.

이후 카메라의 설정에서 Rig - Top Rig, Middle Rig, Bottom Rig에 각각 플레이어의 Head, Chest, Hips를 세팅한다.

Rig를 알맞게 세팅한 후에 마우스 감도를 높이기 위해 스피드 세팅을 한다.
(다른 입력으로도 작동할 수 있게 세팅할 수 있다.

이를 테스트하면 아래와 같아 TPS 게임류의 카메라 효과를 줄 수 있다. 마우스를 움직이는 것으로 시점 변환을 줄 수 있다.

8. Target Group

여러 오브젝트들을 한 화면에 담을 수 있도록 중간 지점을 포커싱 하는 기능이다.

타겟 그룹을 설정하기 위해 플레이어 수를 늘리고, 타겟 그룹 카메라를 만들어 보자.

Target 리스트에 포커싱 대상을 넣고, Radius를 적절하게 조절한다.

카메라의 자연스러운 각도를 위해 Virtual Camera의 Body 에서 Follow Offset도 만져준다.

아래와 같이 테스트해보면 카메라가 포커싱 대상을 잘 따라오는 것을 확인할 수 있고, 임의의 한 명의 위치를 이동시켜도 카메라가 포커싱을 한다.

유의해야 할 점은 포커싱이 된 대상이 지나치게 다른 타겟의 위치에서 벗어날 경우 포커싱이 제대로 되지 않을 수도 있다.

또한 아래와 같이 Weight을 변경하여 어느 타겟에 중점을 둘 건지도 세팅이 가능하다.

9. Impulse

화면의 진동을 구현하기 위한 기능이다. 시네머신에서 지원하는 컴포넌트를 통해 일반 오브젝트에도 진동, 지진효과를 적용하는 것이 가능하다.

9.1 Noise

Virtual Camera를 만들고, Noise의 설정을 Basic Multi Channel Perlin과 Handheld_normal_mild로 설정해보자.

아래와 같이 화면의 흔들림을 줄 수 있으며, Amplitude Gain으로 흔들림 정도를, Frequency Gain으로 흔들림 횟수를 조절할 수 있다.

9.2 Cinemachine Impulse Listener

우선 충돌을 줄 물체를 만들기 위해 Sphere을 설정하고, Collider에 Material을 Bouncy1로, Rigidbody와 Cinemachine Impulse Source를 추가한다.

Virtual Camera 에서 Add Extention을 통해 Cinemachine Inpulse Listener를 추가해준다.

이와 같이 설정하면 아래와 같이 공의 충격에 따라 카메라가 흔들리게 할 수 있다. 마찬가지로 Gain을 통해 충격 정도를 조절할 수 있다.

또한 이런 Cinemachine Inpulse Listener는 오브젝트에도 설정할 수 있으며, Rigidbody와 Cinemachine Independent Impulse Listener를 추가하여 만들수 있다. 이는 생동감 있는 시네마틱 장면을 만드는 데 도움을 줄 수 있다.

profile
게임 만들러 코딩 공부중

0개의 댓글