| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293 | using System;using System.Collections;using System.Collections.Generic;using Common.Combat.FxAILogic;using Fort23.Common;using Fort23.Core;using Fort23.UTool;using GameLogic.Combat.CombatTool;using GameLogic.Combat.Hero;using UnityEngine;using UnityEngine.Rendering;using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventLogic;public class GameTimeLineParticleFactory : ITimeLineParticleFactory{    protected BetterList<CombatParticleSystemPool> allCombatParticleSystem =        new BetterList<CombatParticleSystemPool>();    protected BetterList<FxAILogicBasic> allFxAiLogicBasic = new BetterList<FxAILogicBasic>();    protected bool _isUpdateState;    private BetterList<FxAILogicBasic> _removeFxAiLogicBasic = new BetterList<FxAILogicBasic>();    public void RemoveFxAILogicBasic(FxAILogicBasic fxAILogicBasic)    {        if (_isUpdateState)        {            _removeFxAiLogicBasic.Add(fxAILogicBasic);        }        else        {            allFxAiLogicBasic.Remove(fxAILogicBasic);        }    }    public void CombatUpdate(float time)    {        _isUpdateState = true;        for (int i = 0; i < allFxAiLogicBasic.Count; i++)        {            allFxAiLogicBasic[i].CombatUpdate(time);        }        _isUpdateState = false;        for (int i = 0; i < _removeFxAiLogicBasic.Count; i++)        {            allFxAiLogicBasic.Remove(_removeFxAiLogicBasic[i]);        }        _removeFxAiLogicBasic.Clear();        for (int i = 0; i < allCombatParticleSystem.Count; i++)        {            allCombatParticleSystem[i].CombatUpdate(time);        }    }    public void Dispose()    {        allFxAiLogicBasic.Clear();    }    public void RecycleAllFxAiLogicBasic()    {        _isUpdateState = true;        for (int i = 0; i < allFxAiLogicBasic.Count; i++)        {            allFxAiLogicBasic[i].Dispose();        }        allFxAiLogicBasic.Clear();        _removeFxAiLogicBasic.Clear();        _isUpdateState = false;    }    public List<FxAILogicBasic> GetFxAILogicBasic(bool isEnemy)    {        List<FxAILogicBasic> data = new List<FxAILogicBasic>();        for (int i = 0; i < allFxAiLogicBasic.Count; i++)        {            FxAILogicBasic fxAILogicBasic = allFxAiLogicBasic[i];            if (fxAILogicBasic.CombatHeroEntity.IsEnemy == isEnemy)            {                data.Add(fxAILogicBasic);            }        }        return data;    }    public void RecycleFix()    {#if !COMBAT_SERVER        CombatParticleSystemPool[] pools = allCombatParticleSystem.ToArray();        if (pools != null)        {            List<CombatParticleSystemPool> romvePoll = new List<CombatParticleSystemPool>();            romvePoll.AddRange(pools);            for (int i = 0; i < romvePoll.Count; i++)            {                if (pools[i] == null)                {                    continue;                }                if (pools[i].gameObject != null)                {                    pools[i].gameObject.SetActive(false);                    GObjectPool.Instance.Recycle(pools[i]);                }            }        }#endif        allCombatParticleSystem.Clear();    }    public void RemoveCombatParticleSystemPool(CombatParticleSystemPool combatParticleSystemPool)    {        allCombatParticleSystem.Remove(combatParticleSystemPool);    }    public Clock CreateParticle(TimeLineEventParticleLogicBasic timeLineEventParticleLogicBasic,        ILifetCycleHitPoint effectTarget,        ILifetCycleHitPoint fxTarget, Vector3 startPos, SpecialDotInfo targetSpecialDotInfo,        Action<IGObjectPoolInterface> callBack)    {        Clock clock = CreateParticle(timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.fxName, startPos,            fxTarget,            false, targetSpecialDotInfo, delegate(ParticleSystemPool combatParticleSystemPool)            {                CombatParticleSystemPool pool = combatParticleSystemPool as CombatParticleSystemPool;                if (pool == null)                {                    callBack?.Invoke(null);                    return;                }#if !COMBAT_SERVER                pool.InitCombatParticleSystem();#endif                CombatHeroEntity combatHeroEntity = null;                if (targetSpecialDotInfo != null)                {                    combatHeroEntity = targetSpecialDotInfo.heroEntity as CombatHeroEntity;                    // if (!timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.isActivityCustomTargetPos)                    // {                    //     startPos = targetSpecialDotInfo.GetWorlPos();                    // }                    if (!timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.isNotRotate)                    {                        pool.transform.eulerAngles = targetSpecialDotInfo.GetEulerAngles();                        pool.isNotRotion = false;                    }                    else                    {                        pool.isNotRotion = true;                    }                    // if (heroEntity != null)                    // {                    //     pool.transform.SetParent(heroEntity.CombatHeroTransform.iGObjectPoolInterface.own.transform);                    // }                    // else                    // {                    //     pool.transform.SetParent(targetSpecialDotInfo.targetTran);                    // }                }                else if (fxTarget != null)                {                    if (!timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.isNotRotate)                    {                        pool.transform.eulerAngles = fxTarget.GetSpecialDotInfo("").GetEulerAngles();                        pool.isNotRotion = false;                    }                    else                    {                        pool.isNotRotion = true;                    }                }                if (combatHeroEntity != null && timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.isLoop)                {                    combatHeroEntity.heroLoopParticle.Add(pool);                    pool.HeroEntity = combatHeroEntity;                }                pool.gameObject.SetActive(false);                pool.transform.position = startPos;                if (timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.isFollowRootTarget &&                    timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.locationType !=                    FXLocationType.SceneZero)                {                    if (combatHeroEntity != null)                    {                        pool.transform.SetParent(combatHeroEntity.GetMainHotPoin<CombatHeroHitPoint>()                            .GetSpecialDotInfo("").targetTran);                    }                    else if (fxTarget != null)                    {                        pool.transform.SetParent(fxTarget                            .GetSpecialDotInfo("").targetTran);                    }                    pool.transform.localEulerAngles = Vector3.zero;                }                else if (timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.isFollowTarget &&                         timeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.locationType !=                         FXLocationType.SceneZero)                {                    pool.transform.SetParent(targetSpecialDotInfo.targetTran);                    pool.transform.localEulerAngles = Vector3.zero;                    pool.transform.localPosition = Vector3.zero;                    // pool.targetSpecialDotInfo = targetSpecialDotInfo;                }                else                {                    // pool.transform.SetParent(null);                    pool.targetSpecialDotInfo = null;                }                FxAILogicBasic fxAILogicBasic = pool.own.GetComponent<FxAILogicBasic>();                if (fxAILogicBasic != null)                {                    if (!allFxAiLogicBasic.Contains(fxAILogicBasic))                    {                        allFxAiLogicBasic.Add(fxAILogicBasic);                    }                    fxAILogicBasic.SetAIMonoObj(combatParticleSystemPool);                    fxAILogicBasic.Init(startPos, timeLineEventParticleLogicBasic, effectTarget,                        targetSpecialDotInfo);                }#if !COMBAT_SERVER                pool.gameObject.SetActive(true);#endif                callBack?.Invoke(combatParticleSystemPool);            });        return clock;    }    public Clock CreateParticle(string fxName, Vector3 startPos, ILifetCycleHitPoint fxTarget, bool isRotate,        SpecialDotInfo targetSpecialDotInfo, Action<ParticleSystemPool> callBack)    {#if !COMBAT_SERVER        Clock clock = ClockPool.GetClock();        CTask<CombatParticleSystemPool> task = GObjectPool.Instance.FetchAsync(fxName + ".prefab",            delegate(CombatParticleSystemPool pool)            {                if (pool == null)                {                    callBack?.Invoke(null);                    return;                }                if (isRotate && fxTarget != null)                {                    SpecialDotInfo specialDotInfo = fxTarget.GetSpecialDotInfo(null);                    if (specialDotInfo != null)                    {                        pool.transform.eulerAngles = specialDotInfo.GetEulerAngles();                    }                }                float size = 1;                pool.SetSize(size);                pool.own.transform.position = startPos;                pool.ClearTrail();                callBack?.Invoke(pool);            }, clock);        return clock;#else            callBack?.Invoke(new CombatParticleSystemPool());            return null;#endif    }}
 |