Camera Shake Effect 를 위해 Main Camera 에 CinemachineBrain 컴포넌트를 붙이고,
Virtual Camera 를 새로 만들었다. 이를 수정된 PlayerCameraController 스크립트에 제공했다.
public class PlayerCameraController : MonoBehaviour
{
public Camera mainCam;
public CinemachineVirtualCamera vcam;
}
원래 PlayerCameraController 에 FollowCam 스크립트가 있었는데, Cinemachine 에서 제공하는 Follow 기능을 사용하기 위해 제거했다.
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
: 카메라가 많이 흔들림