| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193 | using System.Collections.Generic;using CombatLibrary.CombatLibrary.CombatCore.CustomizeTimeLogic.FxLogic;using Common.Combat.FxAILogic;using Core.Triiger;using Fort23.Core;using GameLogic.Combat.CombatTool;using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;using UnityEngine;using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;namespace GameLogic.Combat.Skill.MagicSkill{    public class S3401FxMove : CObject    {        public Vector3 endPos;        public FxAILogicBasic fxAILogicBasic;        public float moveSpeed = 8;        private System.Action finishCallBack;        private bool isUpdate;        private float moveTime;                public void InitActive(Vector3 endPos, System.Action finishCallBack)        {            this.endPos = endPos;            moveTime = 0;            this.finishCallBack = finishCallBack;            isUpdate = true;        }        public override void ActiveObj()        {        }        public override void DormancyObj()        {            fxAILogicBasic = null;            isUpdate = false;        }        public bool Update(float t)        {            if (!isUpdate)            {                return false;            }            Vector3 pos = fxAILogicBasic.gameObject.transform.position;            Vector3 dir = endPos - pos;            float distance = dir.magnitude;            float addT = 1.0f / (distance / moveSpeed);            moveTime += t * addT;            Vector3 d = Vector3.Lerp(pos, endPos, moveTime);            fxAILogicBasic.gameObject.transform.position = d;            Quaternion quaternion = Quaternion.LookRotation(dir);            fxAILogicBasic.gameObject.transform.rotation = quaternion;            if (moveTime >= 1)            {                fxAILogicBasic.Dispose();                finishCallBack?.Invoke();                isUpdate = false;                CObjectPool.Instance.Recycle(this);                return false;            }            return true;        }    }    /// <summary>    /// 宝塔在英雄的头顶前往位置旋转,形成一个扇形区域,敌人的功法如果进入这个扇形区域有很大的概率被法宝吸收    ///(飞到玩家头顶持续施法)    /// 100%吸收,切吸收后临时增加玩家对于吸收功法的灵根    /// </summary>    public class S3401 : MagicSkillBasic, ITriggerEntity    {        private List<S3401FxMove> _currTriggerFx = new List<S3401FxMove>();        private float _currTime;        private bool _isUpdae;        private IUnRegister _unRegister;        private TimeLineEventLogicGroupBasic _timeLineEventLogicGroupBasic;        protected override void ProMagicUseSkill()        {            _currTime = 0;            _isUpdae = false;            TimeLineEventLogicGroupBasic timeLineEventLogicGroupBasic = ActivationTimeLineData("sk1_xiaoshi");            timeLineEventLogicGroupBasic.TimeLineUpdateEnd = delegate()            {                Vector3 targetPos = CombatMagicWeaponEntity.RootMagicWeaponControl.combatHeroEntity                    .GetSpecialDotInfo("toupos2").GetWorlPos();                Transform root = CombatMagicWeaponEntity.RootMagicWeaponControl.combatHeroEntity.GameObject.transform;                // Vector3 pos = root.TransformPoint(new Vector3(0, 4, 4));                Quaternion quaternion = Quaternion.Euler(110, 0, 0);                CombatHeroEntity.GameObject.transform.rotation = root.rotation * quaternion;                // Vector3 d = root.rotation * _dir;                CombatHeroEntity.GameObject.transform.position = targetPos;                TimeLineEventLogicGroupBasic sk1_show = ActivationTimeLineData("sk1_show");                sk1_show.TimeLineUpdateEnd = ShowFinish;            };        }        protected void ShowFinish()        {            _timeLineEventLogicGroupBasic = ActivationTimeLineData("sk1");            SpecialDotInfo specialDotInfo =                CombatMagicWeaponEntity.GetSpecialDotInfo("sk1");            _unRegister = specialDotInfo.targetTran.gameObject.OnTriggerEnterEvent(this, OnTriggerExitEvent);            _isUpdae = true;        }        protected override void MagicSkillUpdate(float time)        {            for (int i = 0; i < _currTriggerFx.Count; i++)            {                S3401FxMove fxMove = _currTriggerFx[i];                bool isUpdate = fxMove.Update(time);                if (!isUpdate)                {                    ActivationTimeLineData("sk1_hit");                    _currTriggerFx.RemoveAt(i);                    i--;                }            }            if (!_isUpdae)            {                return;            }            _currTime += time;            if (_currTime > effectValue[1])            {                _isUpdae = false;                if (_timeLineEventLogicGroupBasic != null)                {                    _timeLineEventLogicGroupBasic.CloseLoopFx();                }                ActivationTimeLineData("sk1_xiaoshi");                SkillPlayFinish();            }        }        protected override void ProSkillPlayFinish()        {            _isUpdae = false;            _currTime = 0;            _unRegister.UnRegister();            CombatHeroEntity.CloseLoopFx();        }        protected override void ProBreakMagicSkill()        {            _isUpdae = false;            SkillPlayFinish();        }        private void OnTriggerExitEvent(Collider collider, ITriggerEntity triggerEntity)        {            if (triggerEntity == null)            {                return;            }            FxAILogicBasic fxAILogicBasic = triggerEntity as FxAILogicBasic;            if (fxAILogicBasic != null && fxAILogicBasic.CombatHeroEntity.IsEnemy != CombatHeroEntity.IsEnemy)            {                if (!fxAILogicBasic.isInit)                {                    return;                }                int odds = CombatCalculateTool.Instance.GetOdd(0, 100);                if (odds < effectValue[0])                {                    fxAILogicBasic.isNotMove = true;                    S3401FxMove fxMove = CObjectPool.Instance.Fetch<S3401FxMove>();                    fxMove.fxAILogicBasic = fxAILogicBasic;                    fxMove.InitActive(CombatHeroEntity.dotPos, null);                    _currTriggerFx.Add(fxMove);                }            }        }        public string tag { get; }    }}
 |