using System;
using Cysharp.Threading.Tasks;
using Gameplay.Level;
using Gameplay.Pause;
using Gameplay.Pool;
using Gameplay.Unit;
namespace Gameplay.Effect
{
using Framework;
using UnityEngine;
using Skill;
public class EffectPlayingData
{
///
/// pauser信息直接放这里
///
public DataEffectPauser pauserData;
public GameUnit owner;
public GameObject rootObj;
public Action onLoaded;
private TrailRenderer[] _trails;
public Transform transform
{
get
{
if (rootObj == null)
{
return null;
}
return rootObj.transform;
}
}
public float remainTime { get; private set; }
public bool autoDestroy;
public bool isLoaded { get; private set; }
public bool needReturn
{
get
{
return (autoDestroy && remainTime <= 0) || _forceDestroy;
}
}
private BaseEffectLogic _logic;
private bool _forceDestroy;
public readonly int effectId;
public bool isReturned;
public EffectPlayingData(int effectId)
{
this.effectId = effectId;
isLoaded = false;
}
public void Reset()
{
_forceDestroy = false;
autoDestroy = false;
isReturned = false;
if (_trails != null)
{
for (int i = 0; i < _trails.Length; i++)
{
var trail = _trails[i];
trail.enabled = true;
}
}
}
public async void Load(string prefabPath)
{
if (isLoaded) return;
isLoaded = true;
var sampleObj = await EffectManager.instance.orderCacher._LoadEffect(prefabPath);
if (sampleObj == null)
{
DebugUtil.LogError("特效不存在:{0}", prefabPath);
return;
}
if (rootObj == null)
{
// 说明已经被销毁了
return;
}
var obj = Object.Instantiate(sampleObj, rootObj.transform);
obj.transform.ResetLocals();
obj.SetActive(false);
await UniTask.DelayFrame(1);
if (obj == null)
{
// 这里如果被销毁了,说明游戏都结束了
return;
}
obj.SetActive(true);
_trails = obj.GetComponentsInChildren();
rootObj.SetLayerEx(rootObj.layer);
if (onLoaded != null)
{
onLoaded();
}
EventManager.Instance.Send(EventManager.EventName.EFFECT_INST_FINISHED, this);
}
public void SetRemainTime(float setTime)
{
remainTime = setTime;
autoDestroy = remainTime > 0;
}
public void AddLogic(BaseEffectLogic logic)
{
if (_logic != null)
{
ObjPoolManager.instance.Return(logic);
}
autoDestroy = false;
_logic = logic;
_logic.effect = this;
}
public void LogicUpdate(float dt)
{
if (LevelManager.Instance.CurrentLevel?.isInBattle ?? false)
{
if (SkillManager.instance != null)
{
if (SkillManager.instance.inSkillingUnit != owner)
{
dt *= SkillManager.instance.needSkillPaused ? 0 : 1;
}
}
}
if (autoDestroy)
{
remainTime -= dt;
}
if (_logic != null)
{
_logic.LogicUpdate(dt);
}
}
public void Destroy()
{
_forceDestroy = true;
if (isReturned)
{
return;
}
isReturned = true;
EventManager.Instance.Send(EventManager.EventName.EFFECT_INST_RETURN, this);
if (_logic != null)
{
ObjPoolManager.instance.Return(_logic);
_logic = null;
}
if (_trails != null)
{
for (int i = 0; i < _trails.Length; i++)
{
var t = _trails[i];
t.Clear();
t.enabled = false;
}
}
EffectManager.instance.ReturnEffect(this);
}
public void RealDestroy()
{
_logic = null;
_forceDestroy = true;
if (rootObj != null)
{
rootObj.Destroy();
rootObj = null;
}
}
public void SetActive(bool active)
{
if (rootObj == null) return;
rootObj.SetActive(active);
}
}
}