popcorn/Scripts/Utilities/ParticleDestroyer.cs

78 lines
2.8 KiB
C#

using UnityEngine;
using System;
[DisallowMultipleComponent]
public class ParticleDestroyer : MonoBehaviour {
private Action callback = ActionExtensions.EmptyAction;
void Start(){
float lifetime = 0.0f;
transform.FindComponent<ParticleSystem>(ps => {
lifetime = Mathf.Max(GetLifeTime(ps), lifetime);
});
transform.FindAllChildrensComponent<ParticleSystem>(ps => {
lifetime = Mathf.Max(GetLifeTime(ps), lifetime);
});
this.CallWaitForSeconds(lifetime, () => {
callback();
Destroy(gameObject);
});
}
private float GetLifeTime(ParticleSystem ps){
var lifeTime = 0.0f;
switch(ps.main.startLifetime.mode){
case ParticleSystemCurveMode.Constant:
lifeTime = ps.main.startLifetime.constant;
break;
case ParticleSystemCurveMode.TwoConstants:
lifeTime = ps.main.startLifetime.constantMax;
break;
case ParticleSystemCurveMode.Curve:
lifeTime = ps.main.startLifetime.curve.GetMax();
break;
case ParticleSystemCurveMode.TwoCurves:
lifeTime = Mathf.Max(ps.main.startLifetime.curveMin.GetMax(), ps.main.startLifetime.curveMax.GetMax());
break;
}
if(ps.trails.enabled){
var trailLifeTime = 0.0f;
switch(ps.trails.lifetime.mode){
case ParticleSystemCurveMode.Constant:
trailLifeTime = ps.trails.lifetime.constant;
break;
case ParticleSystemCurveMode.TwoConstants:
trailLifeTime = ps.trails.lifetime.constantMax;
break;
case ParticleSystemCurveMode.Curve:
trailLifeTime = ps.trails.lifetime.curve.GetMax();
break;
case ParticleSystemCurveMode.TwoCurves:
trailLifeTime = Mathf.Max(ps.trails.lifetime.curveMin.GetMax(), ps.trails.lifetime.curveMax.GetMax());
break;
}
lifeTime += trailLifeTime;
}
lifeTime += ps.main.duration;
if(ps.subEmitters.enabled){
for(int i = 0; i < ps.subEmitters.subEmittersCount; ++i){
switch(ps.subEmitters.GetSubEmitterType(i)){
case ParticleSystemSubEmitterType.Birth:
lifeTime = Mathf.Max(GetLifeTime(ps.subEmitters.GetSubEmitterSystem(i)), lifeTime);
break;
case ParticleSystemSubEmitterType.Death:
lifeTime += GetLifeTime(ps.subEmitters.GetSubEmitterSystem(i));
break;
}
}
}
return lifeTime;
}
public void SetCallback(Action callback){
this.callback = callback;
}
}