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); } } }