using System;
using Fort23.Core;
using Fort23.Mono;
#if !COMBAT_SERVER
using CombatLibrary.CombatLibrary.CombatCore.GPool;
using UnityEngine;
#endif
namespace Fort23.UTool
{
public class ParticleSystemPool : GObjectPoolBasic
{
#if !COMBAT_SERVER
//public string endPlayerPartic;
protected ParticleSystem[] m_particles;
protected RenderSetting[] m_renderSetting;
protected DelayShow[] delayShows;
public float delayTime;
protected float currDelayTime;
public string endFx;
private bool isShow;
///
/// 播放速度
///
public float palySpeed = (float) 1;
private BetterList _lastLoopFx = new BetterList();
private LoopDelayHide _loopDelayHide;
protected HideShowEndFx _hideShowEndFx;
public ParticleSystem[] Particles
{
get
{
if (m_particles == null&&transform!=null)
{
m_particles = transform.GetComponentsInChildren(false);
}
return m_particles;
}
}
public Animator[] Animators
{
get
{
if (m_animators == null&&transform!=null)
{
m_animators = transform.GetComponentsInChildren(false);
}
return m_animators;
}
}
private Animator[] m_animators;
public RenderSetting[] RenderSetting
{
get
{
if (m_renderSetting == null&&transform!=null)
{
m_renderSetting = transform.GetComponentsInChildren(false);
}
return m_renderSetting;
}
}
public DelayShow[] DelayShows
{
get
{
if (delayShows == null)
{
delayShows = transform.GetComponentsInChildren(false);
}
return delayShows;
}
}
[ContextMenu("Replay")]
public void Replay()
{
ResetData();
ActiveObj();
}
private float m_duration = -1f;
protected override void ProResetData()
{
try
{
//ParticleSystem a;
//a.SendMessageUpwards
if (gameObject == null)
{
return;
}
if (Particles != null)
{
for (int i = 0; i < Particles.Length; i++)
{
Particles[i].Stop();
Particles[i].Clear();
}
}
//NsEffectManager.RunReplayEffect(gameObject, true);
}
catch (Exception ex)
{
LogTool.Warning(ex.ToString());
}
}
public override async CTask DelayHide()
{
if (_loopDelayHide == null)
{
await base.DelayHide();
return;
}
bool loopTime = false;
if (Particles != null)
{
for (int i = 0; i < Particles.Length; i++)
{
bool isLoop = Particles[i].main.loop;
if (isLoop && !_loopDelayHide.excludeObject.Contains(Particles[i].gameObject))
{
loopTime = true;
_lastLoopFx.Add(Particles[i]);
ParticleSystem.MainModule mainModule = Particles[i].main;
mainModule.loop = false;
}
}
}
if (loopTime)
{
await TimerComponent.Instance.WaitAsync((int) (_loopDelayHide.delayTime * 1000));
}
}
protected override void ProActiveObj()
{
//gameObject.SetActive(true);
_loopDelayHide = own.GetComponent();
_hideShowEndFx = own.GetComponent();
for (int i = 0; i < Particles.Length; i++)
{
if (_lastLoopFx.Contains(Particles[i]))
{
ParticleSystem.MainModule main = Particles[i].main;
main.loop = true;
}
Particles[i].Stop();
Particles[i].Clear(true);
Particles[i].Play(true);
}
if (DelayShows != null)
{
for (int i = 0; i < DelayShows.Length; i++)
{
DelayShows[i].Init();
}
}
currDelayTime = (float) 0;
StaticUpdater.Instance.AddRenderUpdateCallBack(UpdatePool);
isShow = true;
}
protected virtual void UpdatePool()
{
currDelayTime += Time.deltaTime;
if (IsFinish())
{
OnDurationUp();
}
}
public bool IsFinish()
{
if (Particles.Length <= 0&&delayTime<=0)//没有特效的表现
{
delayTime = 30;
}
if (currDelayTime < delayTime)
{
return false;
}
bool isFinish = true;
for (int i = 0; i < Particles.Length; i++)
{
if (!Particles[i])
continue;
if (Particles[i].IsAlive())
{
isFinish = false;
break;
}
}
return isFinish;
}
protected virtual void OnDurationUp()
{
if (this == null ||
gameObject == null)
{
return;
}
CloseData();
GObjectPool.Instance.Recycle(this);
}
private void CloseData()
{
StaticUpdater.Instance.RemoveRenderUpdateCallBack(UpdatePool);
}
protected override void ProDormancyObj()
{
if (isShow)
{
if (!string.IsNullOrEmpty(endFx))
{
// LoadResourceTask fxTask = CombatController.Instance.LoadCombatFX(endFx,
// null, delegate(IPoolObject pool)
// {
// if (pool != null)
// {
// pool.myTran.position = transform.position;
// }
// });
}
isShow = false;
}
CloseData();
if (gameObject == null)
{
return;
}
for (int i = 0; i < Particles.Length; i++)
{
Particles[i].Stop();
}
gameObject.SetActive(false);
}
//private void PlayerEnd()
//{
// if (endPlayerPartic != null)
// {
// CombatController.Instance.LoadCombatFX(endPlayerPartic, delegate (IPoolObject pool)
// {
// }, transform.parent, null, null);
// }
//}
protected override void ProOnDestroy()
{
if (!gameObject)
{
return;
}
base.ProOnDestroy();
//if (endPlayerPartic != null)
//{
//}
// Destroy(gameObject);
}
#endif
}
}