using Sirenix.OdinInspector; using UnityEngine; using UnityEngine.Rendering; namespace Beyond { public class CameraShaker : MonoBehaviour { [Header("Shake Settings")] public float amplitude = 0.1f; // Si�a drgania public float duration = 1.0f; // Czas trwania drgania public float frequency = 20f; // Pr�dko�� 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�e by� w��czony, ale shake dzia�a tylko po evencie } void Oestroy() { RenderPipelineManager.endCameraRendering -= OnEndCameraRendering; } [Button] public void StartShake() { if (isShaking) return; // Je�li shake ju� dzia�a, nie uruchamiaj ponownie isShaking = true; shakeTime = 0f; lastShakeOffset = Vector3.zero; // Reset poprzedniego przesuni�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�cie localShakeOffset = new Vector3(x, y, z); // Usuwamy poprzednie przesuni�cie, dodajemy nowe mainCamera.localPosition -= lastShakeOffset; mainCamera.localPosition += localShakeOffset; // Zapami�tujemy ostatnie przesuni�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�cie localShakeOffset = new Vector3(x, y, z); orginalPos = transform.position; // Usuwamy poprzednie przesuni�cie, dodajemy nowe transform.position += localShakeOffset; } } void OnEndCameraRendering(ScriptableRenderContext context, Camera camera) { if (isShaking) { transform.position = orginalPos; if (shakeTime >= duration) { isShaking = false; } } } } }