#6 Robot! Escape! - Camera Shake

w298·2022년 10월 22일
0

DEVLOG - Robot! Escape!

목록 보기
6/21

Cinemachine 설정

Camera Shake Effect 를 위해 Main Camera 에 CinemachineBrain 컴포넌트를 붙이고,
Virtual Camera 를 새로 만들었다. 이를 수정된 PlayerCameraController 스크립트에 제공했다.

public class PlayerCameraController : MonoBehaviour
{
    public Camera mainCam;
    public CinemachineVirtualCamera vcam;
}

원래 PlayerCameraController 에 FollowCam 스크립트가 있었는데, Cinemachine 에서 제공하는 Follow 기능을 사용하기 위해 제거했다.

Follow Cam (Cinemachine) 설정

Camera Shake Effect

Cinemachine 의 Noise 기능을 이용했다.

  • Amplitude Gain = 1

  • Amplitude Gain = 3

총기가 발사될 때마다 작동해야 하므로 Amplitude Gain 값을 PlayerCameraController 에서 다룬다.

public struct ShakeParameter
{
    public ShakeParameter(float inten = 0, float dur = 0, float remain = 0)
    {
        startShakeIntensity = inten;
        shakeDuration = dur;
        remainShake = remain;
    }

    readonly public float startShakeIntensity;
    readonly public float shakeDuration;
    public float remainShake;
}

public class PlayerCameraController : MonoBehaviour
{
    public Camera mainCam;
    public CinemachineVirtualCamera vcam;

    private CinemachineBasicMultiChannelPerlin perlin;
    private ShakeParameter shake;

    private void Awake()
    {
        perlin = vcam.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
    }

    public void ShakeCamera(float intensity, float duration)
    {
        perlin.m_AmplitudeGain = intensity;

        shake = new ShakeParameter(intensity, duration, duration);
    }

    private void Update()
    {
        if (shake.remainShake > 0)
        {
            shake.remainShake -= Time.deltaTime;
            perlin.m_AmplitudeGain = Mathf.Lerp(shake.startShakeIntensity, 0f, 1 - shake.remainShake / shake.shakeDuration);
        }
    }
}

ShakePararmeter 라는 새로운 클래스를 만들었는데 다음과 같다.

  • startShakeIntensity : 시작 Amplitude Gain 값
  • shakeDuration : 지속시간
  • remainShake : 남은 지속시간

ShakeCamera 호출은 이전에 만든 GunController 에서 진행한다.

// GunController.cs
private void FireWeapon()
{
    ...
    camController.ShakeCamera(0.7f, 0.07f);
    ...
}

총기가 발사될 때마다 카메라가 짧게 흔들리므로 fireDelay 가 작을수록 더 많이 흔들린다.

  • fireDelay = 0.5 : 카메라가 적게 흔들림

  • fireDelay = 0.05 : 카메라가 많이 흔들림

profile
Game Developer & Web Developer

0개의 댓글