popcorn/Scripts/Utilities/ParticleEventReceiver.cs

51 lines
1.6 KiB
C#

using UnityEngine;
using UnityEngine.Events;
[DisallowMultipleComponent]
public class ParticleEventReceiver : MonoBehaviour {
[SerializeField]
private UnityEvent onEnd = default;
public UnityEvent OnEnd {
get{ return onEnd; }
}
private float interval = 0.0f;
public float Interval {
get{ return interval; }
}
private Coroutine coroutine;
void Awake(){
transform.FindComponent<ParticleSystem>(UpdateInterval);
transform.FindAllChildrensComponent<ParticleSystem>(UpdateInterval);
}
private void UpdateInterval(ParticleSystem ps){
switch(ps.main.startLifetime.mode){
case ParticleSystemCurveMode.Constant:
interval = Mathf.Max(ps.main.startLifetime.constant, interval);
break;
case ParticleSystemCurveMode.TwoConstants:
interval = Mathf.Max(ps.main.startLifetime.constantMin, interval);
interval = Mathf.Max(ps.main.startLifetime.constantMax, interval);
break;
case ParticleSystemCurveMode.Curve:
interval = Mathf.Max(ps.main.startLifetime.curve.GetMax(), interval);
break;
case ParticleSystemCurveMode.TwoCurves:
interval = Mathf.Max(ps.main.startLifetime.curveMin.GetMax(), interval);
interval = Mathf.Max(ps.main.startLifetime.curveMax.GetMax(), interval);
break;
}
}
void OnEnable(){
coroutine = this.CallWaitForSeconds(interval, onEnd.Invoke);
}
void OnDisable(){
this.SafeStopCoroutine(coroutine);
}
}