[Unity] 시네마신 카메라로 화면 흔들리게 하기 (Cinemachine Impulse)

Learning 

When: 1학년 6월 15일

 

How:

게임에서 적에게 맞으면 화면이 흔들리는 것을 구현하려고 했는데, 이렇게 자주 쓰는 기능을 유니티에서 제공하지 않을 것 같지 않아서 GPT에게 물어보니 시네마신 카메라에 기능이 있다고 하였습니다.

 

Understanding:

저는 지금까지 오브젝트를 따라가게 하는 기능만 사용하고 있었지만, 시네마신 카메라는 다양한 기능이 있는데, 카메라 전환, 화면 흔들기, 카메라 반응 영역을 지정하기 등 유용한 기능이 많이 있습니다. 화면 흔들기는 시네마신 카메라로 세팅하고, 코드로 흔들기 실행해주면 아주 쉽게 구현할 수 있습니다.

    [SerializeField] private CinemachineImpulseSource impulse; //CinemachineImpulseSource 변수로 받기 
    
    private void Shake()
    {
        impulse.GenerateImpulse(); //흔들기 메서드
    }

이렇게 Cinemachine Impulse Source를 컴포넌트에 추가해주고, Cinemachine Impulse Listener도 추가해 주면, 컴포넌트 준비는 끝납니다. (시네마신 기능을 사용할 때 시네마신 카메라 컴포넌트는 꼭 있어야 합니다.)

Source의 설정

  • Impulse Channel: 채널인데 Listener의 채널과 같아야 합니다.
  • Impulse Type: 충격을 어떻게 전달할지 (Uniform: 모든 방향에 균일하게 퍼짐, Directional: 방향이 있는 충격 전달 — 총에 맞았을 때 총알의 방향에 따라 충격 방향도 다르게 하고 싶을 때 사용)
  • Impulse Shape: 충격의 파형 형태 (Bump: 빠르게 진동하고 점점 줄어듦, Recoil, Explosion 등 다양한 타입이 있으며, 옆의 숫자는 지속 시간입니다.)
  • Default Velocity: 충격이 퍼지는 기본 방향입니다.
  • Test With Force: 게임 실행하고 Invoke를 누르면 수동으로 흔들 수 있습니다. 오른쪽은 세기입니다.

Listener의 설정

  • Apply After: 이 흔들림을 카메라 파이프라인의 어느 단계에 적용할지 설정합니다. (기본적으로 Noise로 설정되어 있습니다.)
  • Channel Mask: 받아들일 채널입니다. (기본 값은 default이며, Source의 채널과 같아야 합니다.)
  • Gain: 흔들림의 강도를 조절합니다. (1 = 100%)
  • Use 2D Distance: 거리 감쇠를 2D로 계산할지 여부입니다. (2D 게임에서는 체크 해제해야 합니다.)
  • Use Camera Space: 충격 방향을 카메라 기준으로 해석할지 여부입니다. (체크하면 카메라의 회전에 따라 방향도 바뀝니다.)
  • Signal Combination Mode: 여러 충격이 동시에 들어올 때 어떻게 처리할지 결정합니다. (Additive: 모든 충격을 더함(기본), Max: 가장 강한 충격만 반영)
  • Reaction Settings: 
Secondary Noise 기본 충격 외에 보조적인 흔들림 노이즈를 줘서 복잡한 연출을 쓸 때 사용 가능합니다.
Amplitude Gain 진폭(흔들림의 크기)을 조절합니다. 기본값은 1입니다.
Frequency Gain 흔들림의 속도/빈도를 조절합니다. 기본값은 1입니다.
Duration 충격이 적용되는 총 지속 시간입니다. 기본값은 1초입니다.

 

Result: 굳이 코드로 열심히 구현하지 않아도 웬만한 움직임은 Unity에서 시네마신으로 구현해주었으니 요긴하게 쓰도록 하시는 것이 좋습니다.