공부 기록/유니티 Unity

[Unity/TIL] 시네머신 활용 정리 (추적, 전환, 흔들림)

톰마토 2025. 3. 20. 20:38
728x90

시네머신

시네머신은 유니티에서 카메라를 제어하라고 만들어준 시스템이다. 코딩 없이 카메라 이동, 전환, 흔들림, 추적 가능.

배우고 보니 시네머신이 여태 내가 필요했던 것들을 해주더라.!! 

 

여러 가상 카메라를 두고 각 가상 카메라마다 독립적인 속성을 가지게 하고, 이 가상 카메라들을 이용해서 다양한 효과를 줄 수 있다. 

  • Blend List Camera : 여러 개의 가상 카메라를 두고 그 카메라들의 전환을 도와줌. 
  • State Driven Camera : 애니메이션 상태에 따라 전환. ex) 캐릭터를 머리 위에서 찍다가 이동할 때는 등이 보이게 찍는다든지
  • Dolly Camera : 카메라가 레일을 지나가며 찍게 함. 오프닝 씬 등의 연출을 도와줌. (그 레일을 Dolly 라고 함) 
  • ClearShot : 플레이어가 건물에 들어가서 가릴 때 건물 안에 있는 카메라쪽으로 이동시키게 도와준다든지 하는 역할.

ClearShot 예시

 

자연스러운 카메라 Following 구현

MainCamera에 CinemachineBrain 달아준다. 가상의 카메라들을 둘건데, MainCamera가 가상의 카메라들을 이용해서 촬영할 수 있도록 도와주는 거다. 

MainCamera

빈 오브젝트로 Cameras > Follow Virtual Camera 만듦. 하위 오브젝트인 Follow 머시기에 VirtualCamera 컴포넌트 달아서 가상카메라로 만든다.

Follow Virtual Camera

  • Priority : 지금 얘의 Piriority가 높아서 메인 카메라가 이 카메라를 따라오고 있다. 
  • Follow : Player 넣어줌. (플레이어 따라다니기만 하면 되서 Look At은 비움)
  • Body : Follow에서 사용하는 추적의 방식. 
    • Body를 Framing Transposer 로 설정: 프레임 안에 가둘 수 있는 기능 

여기까지만 해도 카메라가 플레이어를 따라다닌다. 

벽막힘 - 카메라 이동 제한 

카메라가 일정 이상으로 못나가게 해줄 거다.

빈오브젝트에 Polygon Collider를 추가해서 카메라를 가둘 구역을 설정해둔다. (Is Trigger 해놔야 함. )

Collider 설정

그리고 가상 카메라에서 Add Extension > CinemachineConfiner2D 선택한다. 카메라의 위치를 제한해주는 역할을 한다. 

CinemachineConfiner2D

만들었던 Collider를 Bounding Shape 2D에 넣어준다.

카메라가 이동 가능한 영역과 이동하지 못하는 영역 구분해서 표시 된다.

 

Camera Shake 만들기

먹는 쉐이크 아님

아까 만든 Follow 가상 카메라에서 Noise 옵션을 만져준다.

  • Noise - Basic Multi Channel Perlin
  • Noise Profile - 6D Shake

Aplitude Gain(진폭), Frequency Gain(빈도) 는 처음에 각각 1, 1로 되어 있을 것. 이 상태로 게임 실행해보면 카메라가 계속 흔들린다.

6D Shake

그리고 Camera Shake 스크립트를 만들어 넣어준다. 쉐이킹 duration, Amplitude와 Frequency 값을 지정해서 쉐이크해줄 수 있는 함수를 만들었다 : 'ShakeCamera'

public class CameraShake : MonoBehaviour
{
    private CinemachineVirtualCamera virtualCamera;
    private CinemachineBasicMultiChannelPerlin perlin;
    private float shakeTimeRemaining;

    private void Awake()
    {
        virtualCamera = GetComponent<CinemachineVirtualCamera>();
        perlin = virtualCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
    }

    public void ShakeCamera(float duration, float amplitude, float frequency)
    {
        if(shakeTimeRemaining > duration)
        {
            return;
        }
        shakeTimeRemaining = duration;

        perlin.m_AmplitudeGain = amplitude;
        perlin.m_FrequencyGain = frequency;
    }

    private void Update()
    {
        if(shakeTimeRemaining > 0)
        {
            shakeTimeRemaining -= Time.deltaTime;
            if(shakeTimeRemaining <= 0)
            {
                StopShake();
            }
        }
    }

    public void StopShake()
    {
        shakeTimeRemaining = 0;
        perlin.m_FrequencyGain = 0;
        perlin.m_AmplitudeGain = 0;
    }
}

 

그리고 GameManager에서 쉐이크 함수를 만들어줬다. 그럼 얘를 사용하면 되겠죵

    private CameraShake cameraShake;

    private void Awake()
    {	
		// .. 생략 ..
        cameraShake = FindAnyObjectByType<CameraShake>();
    }

    public void MainCameraShake()
    {
        cameraShake.ShakeCamera(1, 1, 1);
    }

 

카메라 전환

아래 맵으로 이동하면 카메라가 전환되도록 할 거다.

 

Fixed Virtual Camera 라는 가상 카메라를 하나 더 만들었다. Priority를 5로 설정해줬다. Follow Virtual Camera의 Priority(10)보다 낮기 때문에 MainCamera의 Brain이 이 가상카메라를 따라가는 건데, 아래 맵으로 이동하면 아래에 있는 가상 카메라의 Priority를 높여서 카메라 전환이 일어날 수 있게 할 것이다.

 

닿으면 전환시켜줄 Collider를 붙여줬다. 

 

그리고 Trigger에 들어오면 Priority를 높이고 나가면 낮추는 스크립트를 작성해서 붙여줬다.

public class VirtualCameraController : MonoBehaviour
{
    CinemachineVirtualCamera vCam;

    public int currentPriority = 5;
    public int activePriority = 20;

    private void Awake()
    {
        vCam = GetComponent<CinemachineVirtualCamera>();
    }

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.gameObject.GetComponent<PlayerController>())
        {
            vCam.Priority = activePriority;
        }
    }

    private void OnTriggerExit2D(Collider2D collision)
    {
        if (collision.gameObject.GetComponent<PlayerController>())
        {
            vCam.Priority = currentPriority;
        }
    }
}

 

전환 속도가 너무 느리면 CinemachineBrain의 Default Blend에서 속도를 조절하면 된다. 

가상 카메라가 여러개거나 시네머신 활용 종류가 많으면 Custom Blend 에셋을 만들어서 카메라 간 전환마다 다른 효과를 줄 수도 있다고 한다. 

728x90