Files

83 lines
2.8 KiB
C#
Raw Permalink Normal View History

2023-04-14 16:18:53 +03:00
using System.Collections;
using Cinemachine;
using UnityEngine;
public class CameraShake : MonoBehaviour
{
2022-10-19 01:26:22 +03:00
public static CameraShake Instance { get; private set; }
private CinemachineVirtualCamera _cinemachineVirtualCamera;
private CinemachineBasicMultiChannelPerlin _cinemachineBasicMultiChannelPerlin;
private CinemachineFramingTransposer _cinemachineFramingTransposer;
2023-04-14 16:18:53 +03:00
private Coroutine _zoomCoroutine;
2022-10-19 01:26:22 +03:00
private float _shakeTimer;
2023-04-14 16:18:53 +03:00
private float _zoomTimer;
private int _defaultZoom;
2022-10-19 01:26:22 +03:00
void Awake()
{
_cinemachineVirtualCamera = GetComponent<CinemachineVirtualCamera>();
_cinemachineBasicMultiChannelPerlin = _cinemachineVirtualCamera.GetCinemachineComponent<CinemachineBasicMultiChannelPerlin>();
_cinemachineFramingTransposer = _cinemachineVirtualCamera.GetCinemachineComponent<CinemachineFramingTransposer>();
_defaultZoom = (int)_cinemachineFramingTransposer.m_TrackedObjectOffset.z;
2022-10-19 01:26:22 +03:00
CheckInstance();
}
2022-10-19 01:26:22 +03:00
private void CheckInstance()
{
if (Instance != null && Instance != this)
Destroy(gameObject);
else
Instance = this;
}
2023-01-05 16:37:41 +02:00
public void Shake(CameraShakerNetwork cameraShaker)
2022-10-19 01:26:22 +03:00
{
_cinemachineBasicMultiChannelPerlin.m_AmplitudeGain = cameraShaker.intensity;
_shakeTimer = cameraShaker.timer;
}
2023-04-14 16:18:53 +03:00
public void Zoom(int zoomValue, float time)
{
if (_zoomCoroutine != null)
StopCoroutine(_zoomCoroutine);
_zoomCoroutine = StartCoroutine(ZoomCoroutine(zoomValue, time));
}
public void ZoomDefault(float time)
{
if (_zoomCoroutine != null)
StopCoroutine(_zoomCoroutine);
_zoomCoroutine = StartCoroutine(ZoomCoroutine(_defaultZoom, time));
}
IEnumerator ZoomCoroutine(float zoomValue, float time)
{
float elapsedTime = 0;
float waitTime = time;
Vector3 startZoom = new Vector3(0, 0, _cinemachineFramingTransposer.m_TrackedObjectOffset.z);
2023-04-14 16:18:53 +03:00
Vector3 endZoom = new Vector3(0, 0, zoomValue);
while (elapsedTime < waitTime)
{
_cinemachineFramingTransposer.m_TrackedObjectOffset = Vector3.Lerp(startZoom, endZoom, (elapsedTime / waitTime));
2023-04-14 16:18:53 +03:00
elapsedTime += Time.deltaTime;
yield return null;
}
_cinemachineFramingTransposer.m_TrackedObjectOffset = endZoom;
2023-04-14 16:18:53 +03:00
}
2022-10-19 01:26:22 +03:00
private void Update()
{
if (_shakeTimer > 0)
{
_shakeTimer -= Time.unscaledDeltaTime;
if (_shakeTimer <= 0)
_cinemachineBasicMultiChannelPerlin.m_AmplitudeGain = 0;
}
2023-04-14 16:18:53 +03:00
if (_zoomTimer > 0)
{
_zoomTimer -= Time.unscaledDeltaTime;
if (_zoomTimer <= 0)
_cinemachineFramingTransposer.m_TrackedObjectOffset = new Vector3(0, 0, _defaultZoom);
2023-04-14 16:18:53 +03:00
}
2022-10-19 01:26:22 +03:00
}
}