114 lines
4.1 KiB
C#
114 lines
4.1 KiB
C#
using Sirenix.OdinInspector;
|
||
using UnityEngine;
|
||
using UnityEngine.Rendering;
|
||
|
||
namespace Beyond
|
||
{
|
||
public class CameraShaker : MonoBehaviour
|
||
{
|
||
[Header("Shake Settings")]
|
||
public float amplitude = 0.1f; // Si<53>a drgania
|
||
public float duration = 1.0f; // Czas trwania drgania
|
||
public float frequency = 20f; // Pr<50>dko<6B><6F> drgania
|
||
|
||
[Header("Shake Curve")]
|
||
public AnimationCurve shakeCurve = AnimationCurve.EaseInOut(0, 1, 1, 0); // Krzywa efektu drgania
|
||
|
||
private float shakeTime = 0f;
|
||
private Vector3 localShakeOffset = Vector3.zero;
|
||
private Transform mainCamera;
|
||
private bool isShaking = false;
|
||
private Vector3 lastShakeOffset = Vector3.zero;
|
||
private Vector3 orginalPos;
|
||
|
||
void Start()
|
||
{
|
||
mainCamera = Camera.main?.transform; // Pobranie MainCamera
|
||
if (mainCamera == null)
|
||
{
|
||
Debug.LogError("CameraShaker: MainCamera not found!");
|
||
enabled = false;
|
||
return;
|
||
}
|
||
RenderPipelineManager.endCameraRendering += OnEndCameraRendering;
|
||
enabled = true; // Skrypt mo<6D>e by<62> w<><77>czony, ale shake dzia<69>a tylko po evencie
|
||
}
|
||
|
||
void Oestroy()
|
||
{
|
||
RenderPipelineManager.endCameraRendering -= OnEndCameraRendering;
|
||
}
|
||
|
||
[Button]
|
||
public void StartShake()
|
||
{
|
||
if (isShaking) return; // Je<4A>li shake ju<6A> dzia<69>a, nie uruchamiaj ponownie
|
||
|
||
isShaking = true;
|
||
shakeTime = 0f;
|
||
lastShakeOffset = Vector3.zero; // Reset poprzedniego przesuni<6E>cia
|
||
}
|
||
|
||
void LateUpdate()
|
||
{
|
||
/*
|
||
if (isShaking && shakeTime < duration)
|
||
{
|
||
shakeTime += Time.deltaTime;
|
||
float shakeStrength = amplitude * shakeCurve.Evaluate(shakeTime / duration);
|
||
|
||
// P<>ynne drgania na bazie Perlin Noise
|
||
float x = (Mathf.PerlinNoise(Time.time * frequency, 0) * 2 - 1) * shakeStrength;
|
||
float y = (Mathf.PerlinNoise(0, Time.time * frequency) * 2 - 1) * shakeStrength;
|
||
float z = (Mathf.PerlinNoise(Time.time * frequency, Time.time * frequency) * 2 - 1) * shakeStrength;
|
||
|
||
// Nowe przesuni<6E>cie
|
||
localShakeOffset = new Vector3(x, y, z);
|
||
|
||
// Usuwamy poprzednie przesuni<6E>cie, dodajemy nowe
|
||
mainCamera.localPosition -= lastShakeOffset;
|
||
mainCamera.localPosition += localShakeOffset;
|
||
|
||
// Zapami<6D>tujemy ostatnie przesuni<6E>cie
|
||
lastShakeOffset = localShakeOffset;
|
||
}
|
||
else if (shakeTime >= duration)
|
||
{
|
||
isShaking = false;
|
||
mainCamera.localPosition -= lastShakeOffset; // Resetujemy shake
|
||
lastShakeOffset = Vector3.zero;
|
||
}
|
||
*/
|
||
if (isShaking && shakeTime < duration)
|
||
{
|
||
shakeTime += Time.deltaTime;
|
||
float shakeStrength = amplitude * shakeCurve.Evaluate(shakeTime / duration);
|
||
|
||
// P<>ynne drgania na bazie Perlin Noise
|
||
float x = (Mathf.PerlinNoise(Time.time * frequency, 0) * 2 - 1) * shakeStrength;
|
||
float y = (Mathf.PerlinNoise(0, Time.time * frequency) * 2 - 1) * shakeStrength;
|
||
float z = (Mathf.PerlinNoise(Time.time * frequency, Time.time * frequency) * 2 - 1) * shakeStrength;
|
||
|
||
// Nowe przesuni<6E>cie
|
||
localShakeOffset = new Vector3(x, y, z);
|
||
orginalPos = transform.position;
|
||
// Usuwamy poprzednie przesuni<6E>cie, dodajemy nowe
|
||
transform.position += localShakeOffset;
|
||
}
|
||
|
||
}
|
||
|
||
void OnEndCameraRendering(ScriptableRenderContext context, Camera camera)
|
||
{
|
||
if (isShaking)
|
||
{
|
||
transform.position = orginalPos;
|
||
if (shakeTime >= duration)
|
||
{
|
||
isShaking = false;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
}
|