Files
2026-03-04 10:03:45 +08:00

103 lines
2.0 KiB
C#

using System.Collections.Generic;
using UnityEngine;
namespace UltimateWater
{
public class ParticleController : MonoBehaviour
{
public enum EmissionType
{
OnWaterEnter = 0,
OnWaterExit = 1,
OnWaterEnterAndExit = 2
}
[SerializeField]
private List<ParticleSystem> _Particles;
[Space]
public WaterSampler Sampler;
[Space]
public EmissionType Type = EmissionType.OnWaterEnterAndExit;
[Space]
public float Emission = 1f;
public float Speed = 1f;
[Tooltip("How fast the emission decreases")]
public float Decrease = 1f;
private readonly ParticleModifier _Modifier = new ParticleModifier();
private float _CurrentEmission;
private void Awake()
{
_CurrentEmission = Emission;
_Modifier.Initialize(_Particles.ToArray());
_Modifier.Speed = Speed;
_Modifier.Active = false;
}
private void OnEnable()
{
Sampler.OnSubmersionStateChanged.AddListener(OnChange);
}
private void OnDisable()
{
Sampler.OnSubmersionStateChanged.RemoveListener(OnChange);
}
private void LateUpdate()
{
_Modifier.Emission = ((_CurrentEmission > 0f) ? _CurrentEmission : 0f);
if (_CurrentEmission > 0f)
{
_CurrentEmission -= Time.deltaTime * Decrease;
if (_CurrentEmission <= 0f)
{
_Modifier.Active = false;
}
}
}
private void OnValidate()
{
if (Application.isPlaying && _Modifier.IsInitialized)
{
_Modifier.Speed = Speed;
}
}
private void Reset()
{
Sampler = GetComponent<WaterSampler>();
}
private void OnChange(WaterSampler.SubmersionState state)
{
bool flag = false;
switch (Type)
{
case EmissionType.OnWaterEnter:
flag = state == WaterSampler.SubmersionState.Under;
break;
case EmissionType.OnWaterExit:
flag = state == WaterSampler.SubmersionState.Above;
break;
case EmissionType.OnWaterEnterAndExit:
flag = true;
break;
}
if (flag)
{
_Modifier.Active = true;
_Modifier.Emission = (_CurrentEmission = Emission);
}
}
}
}