Files
aibis-dream/Assets/Scripts/MiniGame/HuoShan/Emo/RippleManager.cs
T
2025-05-08 16:17:49 +08:00

79 lines
2.1 KiB
C#

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<Ripple> ripples = new List<Ripple>();
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
};
}
}