using UnityEngine; using System.Collections.Generic; public struct Ripple { public Vector3 position; public float startTime; public float strength; } public struct RippleResult { public float height; public float brightness; } public class RippleManager { private List ripples = new List(); private float rippleStrength; private float rippleDuration; private float rippleSpreadSpeed; private float rippleSharpness; private float rippleMaxRadius; public RippleManager(float strength, float duration, float spreadSpeed, float sharpness, float maxRadius) { rippleStrength = strength; rippleDuration = duration; rippleSpreadSpeed = spreadSpeed; rippleSharpness = sharpness; rippleMaxRadius = maxRadius; } public void AddRipple(Vector3 position) { ripples.Add(new Ripple { position = position, startTime = Time.time, strength = rippleStrength }); } public void CleanupRipples() { ripples.RemoveAll(r => Time.time - r.startTime > rippleDuration); } public RippleResult GetRippleEffect(Vector3 position, float currentTime) { float totalHeight = 0f; float totalBrightness = 0f; foreach (var ripple in ripples) { float timeSinceStart = currentTime - ripple.startTime; if (timeSinceStart > rippleDuration) continue; float distance = Vector3.Distance(position, ripple.position); float maxDistance = rippleSpreadSpeed * timeSinceStart; if (distance > maxDistance || distance > rippleMaxRadius) continue; float distFactor = Mathf.Exp(-distance * rippleSharpness); float timeFactor = 1f - (timeSinceStart / rippleDuration); float strength = ripple.strength * distFactor * timeFactor; totalHeight += strength; totalBrightness += strength; } return new RippleResult { height = totalHeight, brightness = totalBrightness }; } }