| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528 | using System.Collections.Generic;using Core.Audio;using Core.Triiger;using Core.Utility;using Fort23.UTool;using GameLogic.Combat.CombatTool;using GameLogic.Combat.Hero;using GameLogic.Combat.Skill;using UnityEditor;using UnityEngine;using UTool.CustomizeTimeLogic.FxLogic.TimeLineEventinterface;namespace Common.Combat.FxAILogic{    [AddComponentMenu("特效脚本/弹道/功法通用弹道")]    public class FxParabolaBulletLogic : FxAILogicBasic    {        public float speed;        public Transform roatRoot;        public int raotIndex;        private IUnRegister UnRegister = null;        public enum CurveType        {            DynamicCurve,            Beeline,            CustomizeCurve,        }        [Header("曲线类型")] public CurveType parabolaCurveType;        [Header("释放碰撞到地面时结束")] public bool isTriggerGroundEnd;        [Header("碰撞到地面时的特效")] public string GroundHitFxName;        [Header("是否使用X曲线跟随角色")] public bool isUseX;        [Header("自定义曲线")] public BesselPath BesselPath;        private Vector3 endPos;        private Vector3 dir;        [Header("存在最长时间")] public float maxTime = 10;        // [Header("是否可以穿透")] public bool isPenetrate;        //        // protected float maxDisSpr;                // private BesselPath _besselPath;        protected BesselPath moveBezierPath;        private float _addTime;        protected Vector3 startDir;        private float dirLerpTime;        private float _currRunTime;        private bool isUpdateDir;        protected override void ProInit()        {            // maxDisSpr = maxDis * maxDis;            _currRunTime = 0;            isUpdateDir = true;            if (roatRoot != null && TimeLineEventParticleLogicBasic.timeLinePlayFxSerializtion.isRoat)            {                roatRoot.transform.eulerAngles = TimeLineEventParticleLogicBasic.customizePos[raotIndex];            }            if (isUseCustomTargetEndPos)            {                endPos = TimeLineEventParticleLogicBasic.customizePos[                    customTargetEndPosIndex];            }            else            {                endPos = AttTarget.GetSpecialDotInfo("hitpos").GetWorlPos();                // endPos = new Vector3(endPos.x, CurrPos.y, endPos.z);            }            if (parabolaCurveType == CurveType.DynamicCurve)            {                Vector3 off = _currPos - CombatHeroEntity.GameObject.transform.position;                float x = Mathf.Sign(Random.Range(-1, 1));                // if (isUseX)                {                    Vector3 pos =                        CombatHeroEntity.GameObject.transform.InverseTransformPoint(gameObject.transform.position);                    x = Mathf.Sign(pos.x);                }                startDir = CombatHeroEntity.GameObject.transform.TransformPoint(off +                    new Vector3(                        x,                        Random.Range(0.1f, 3f),                        Random.Range(0.1f, 4f)));                startDir = (startDir - _currPos).normalized;                dirLerpTime = 0;                dir = (endPos - CurrPos).normalized;                moveTarget.transform.rotation = Quaternion.LookRotation(dir);            }            else if (parabolaCurveType == CurveType.Beeline)            {                dir = (endPos - _currPos).normalized;                gameObject.transform.rotation = Quaternion.LookRotation(dir);            }            else if (parabolaCurveType == CurveType.CustomizeCurve)            {                gameObject.transform.rotation = CombatHeroEntity.GameObject.transform.rotation;                Vector3 pos =                    CombatHeroEntity.GameObject.transform.InverseTransformPoint(gameObject.transform.position);                if (moveBezierPath == null)                {                    moveBezierPath = new BesselPath();                }                moveBezierPath.controlPoints.Clear();                for (int i = 0; i < BesselPath.controlPoints.Count; i++)                {                    Vector3 p = BesselPath.controlPoints[i];                    if (isUseX)                    {                        if (i == 1 || i == 2)                        {                            p.x = pos.x > 0 ? p.x * -1 : p.x;                        }                    }                    moveBezierPath.controlPoints.Add(gameObject.transform.TransformPoint(p / (size * size)));                }                moveBezierPath.SetLengthAtT();                currTime = 0;            }            CombatUpdate(0.016f);            UnRegister = moveTarget.OnTriggerEnterEvent(this, OnTriggerEnterEvent);        }        private float GetMoveSpeed()        {            float v1 = CombatCalculateTool.Instance.GetVlaueRatioForFloat(speed, extraMoveSpeed);            float v = speed + v1;            if (v < 0)            {                v = 1;            }            return v;        }        void TriggerGround()        {            ITimeLineTriggerEvent timeLineTriggerEvent =                TimeLineEventParticleLogicBasic.ITimeLineTriggerEntity as ITimeLineTriggerEvent;            FinishHit(new Vector3(_currPos.x, 0.5f, _currPos.z), GroundHitFxName);            AudioManager.Instance.PlayAudio(hitAudioName, false);            if (timeLineTriggerEvent != null)            {                timeLineTriggerEvent.TimeLineTriggerGround(                    TimeLineEventParticleLogicBasic.TimeLineEventLogicGroup.groupName,                    this, triggerData);            }            AudioManager.Instance.PlayAudio(hitAudioName, false);            Dispose();        }        protected void GetTargetPos()        {            if (isUseCustomTargetEndPos)            {                endPos = TimeLineEventParticleLogicBasic.customizePos[                    customTargetEndPosIndex];            }            else            {                endPos = AttTarget.GetSpecialDotInfo("hitpos").GetWorlPos();                // endPos = new Vector3(endPos.x, CurrPos.y, endPos.z);            }        }        protected void OnTriggerEnterEvent(Collider collision, ITriggerEntity triggerEntity)        {            if (isTriggerGroundEnd)            {                if (collision.gameObject.CompareTag("dimian"))                {                    TriggerGround();                    return;                }            }            FxAILogicBasic fxAILogicBasic = triggerEntity as FxAILogicBasic;            if (fxAILogicBasic != null) //击中其他的功法            {                SkillFeaturesData skillFeaturesData = fxAILogicBasic.SkillFeaturesData;                if (skillFeaturesData.isEnemy == SkillFeaturesData.isEnemy)                {                    return;                }                CombatCalculateTool.Instance.GongFaPengZhuang(SkillFeaturesData, skillFeaturesData, CombatHeroEntity,                    fxAILogicBasic.CombatHeroEntity);                if (SkillFeaturesData.hp > 0)                {                    fxAILogicBasic.PlayPengZhuangHit();                    fxAILogicBasic.Dispose();                }                else if (skillFeaturesData.hp > 0)                {                    Dispose();                    PlayPengZhuangHit();                }                else                {                    fxAILogicBasic.PlayPengZhuangHit();                    fxAILogicBasic.Dispose();                    Dispose();                    PlayPengZhuangHit();                }                return;            }            else            {                HeroEntityMono heroEntityMono = collision.gameObject.GetComponent<HeroEntityMono>();                if (heroEntityMono != null)                {                    TriggerHero(collision, heroEntityMono);                    return;                }                BarrierEntityMono barrierEntityMono = collision.gameObject.GetComponent<BarrierEntityMono>();                if (barrierEntityMono != null)                {                    TriggerBarrier(collision, barrierEntityMono);                }            }        }        public void PengZhuang(SkillFeaturesData targetSkillFeaturesData, CombatHeroEntity targetCombatHeroEntity)        {            CombatCalculateTool.Instance.GongFaPengZhuang(SkillFeaturesData, targetSkillFeaturesData, CombatHeroEntity,                targetCombatHeroEntity);            if (SkillFeaturesData.hp <= 0)            {                PlayPengZhuangHit();                Dispose();            }        }        protected void TriggerBarrier(Collider collision, BarrierEntityMono barrierEntityMono)        {            if (barrierEntityMono == null)            {                return;            }            CombatHeroEntity target = barrierEntityMono.Barrier.Own as CombatHeroEntity;            if (target.IsEnemy == CombatHeroEntity.IsEnemy || target is CombatMagicWeaponEntity)            {                return;            }            if (TimeLineEventParticleLogicBasic.TimeLineEventLogicGroup.groupName == null)            {                Dispose();                return;            }            bool isOk = barrierEntityMono.Barrier.CollideTriiger(this);            if (!isOk) //被主档            {                BarrierTriggerData.isPenetrate = false;                barrierEntityMono.Barrier.BarrierTriggerData = BarrierTriggerData;                triggerData.IBarrier = barrierEntityMono.Barrier;                ITimeLineTriggerEvent timeLineTriggerEvent =                    TimeLineEventParticleLogicBasic.ITimeLineTriggerEntity as ITimeLineTriggerEvent;                if (timeLineTriggerEvent != null)                {                    timeLineTriggerEvent.TimeLineTrigger(                        TimeLineEventParticleLogicBasic.TimeLineEventLogicGroup.groupName,                        target.GetMainHotPoin<ILifetCycleHitPoint>(), this, triggerData, SkillFeaturesData);                    if (!string.IsNullOrEmpty(hitFxName))                    {                        FinishHit(collision.ClosestPoint(moveTarget.transform.position), hitFxName);                    }                    AudioManager.Instance.PlayAudio(hitAudioName, false);                    if (!BarrierTriggerData.isPenetrate)                    {                        if (!isPenetrate)                        {                            Dispose();                        }                    }                }            }        }        protected void TriggerHero(Collider collision, HeroEntityMono heroEntityMono)        {            if (heroEntityMono == null)            {                return;            }            CombatHeroEntity target = heroEntityMono.combatHeroEntity;            if (target.IsEnemy == CombatHeroEntity.IsEnemy || target is CombatMagicWeaponEntity)            {                return;            }            if (TimeLineEventParticleLogicBasic.TimeLineEventLogicGroup.groupName == null)            {                Dispose();                return;            }            ITimeLineTriggerEvent timeLineTriggerEvent =                TimeLineEventParticleLogicBasic.ITimeLineTriggerEntity as ITimeLineTriggerEvent;            if (timeLineTriggerEvent != null)            {                triggerData.IBarrier = null;                isUpdateDir = false;                timeLineTriggerEvent.TimeLineTrigger(TimeLineEventParticleLogicBasic.TimeLineEventLogicGroup.groupName,                    target.GetMainHotPoin<ILifetCycleHitPoint>(), this, triggerData, SkillFeaturesData);                if (!string.IsNullOrEmpty(hitFxName))                {                    FinishHit(collision.ClosestPoint(moveTarget.transform.position), hitFxName);                }                AudioManager.Instance.PlayAudio(hitAudioName, false);                if (!isPenetrate)                {                    Dispose();                }            }        }        private void FinishHit(Vector3 pos, string hitFxName)        {            if (!string.IsNullOrEmpty(hitFxName))            {                CombatController.currActiveCombat.GameTimeLineParticleFactory.CreateParticle(hitFxName,                    pos, null, false, null, CallBack);            }        }        private void CallBack(ParticleSystemPool obj)        {            if (roatRoot != null)            {                obj.transform.rotation = roatRoot.rotation;            }        }        protected override void ProCombatUpdate(float time)        {            _currRunTime += time;            if (_currRunTime > maxTime)            {                Dispose();                return;            }            if (!isNotMove)            {                switch (parabolaCurveType)                {                    case CurveType.Beeline:                        Beeline(time);                        break;                    case CurveType.DynamicCurve:                        DynamicCurve(time);                        break;                    case CurveType.CustomizeCurve:                        CustomizeCurve(time);                        break;                }            }            // if (Vector3.Distance(endPos, _currPos) < 0.5f)            // {            //     Dispose();            // }        }        private void Beeline(float time)        {            GetTargetPos();            if (isUpdateDir)            {                Vector3 dir = (endPos - _currPos).normalized;                // dir = Vector3.Lerp(startDir, dir, dirLerpTime).normalized;                startDir = dir;            }            Vector3 lasetPos = _currPos;            _currPos += startDir * GetMoveSpeed() * time;            moveTarget.transform.position = _currPos;            moveTarget.transform.rotation = Quaternion.LookRotation(dir);        }        private void CustomizeCurve(float time)        {            _addTime = 1.0f / (moveBezierPath.allDis / GetMoveSpeed());            currTime += _addTime * time;            GetTargetPos();            moveBezierPath.controlPoints[3] = endPos;            // moveBezierPath.controlPoints[0] = (gameObject.transform.TransformPoint(BesselPath.controlPoints[0]));            Vector3 p = moveBezierPath.CalculatePoint(currTime);            Vector3 p2 = moveBezierPath.CalculatePoint(currTime - 0.01f);            moveTarget.transform.position = p;            moveTarget.transform.rotation = Quaternion.LookRotation((p - p2).normalized);        }        private void DynamicCurve(float time)        {            dirLerpTime += time * 4F;            if (dirLerpTime > 1)            {                dirLerpTime = 1;            }            GetTargetPos();            Vector3 dir = (endPos - _currPos).normalized;            dir = Vector3.Lerp(startDir, dir, dirLerpTime).normalized;            // startDir= dir;            Vector3 lasetPos = _currPos;            _currPos += dir * GetMoveSpeed() * time;            moveTarget.transform.position = _currPos;            moveTarget.transform.rotation = Quaternion.LookRotation(dir);        }        protected override void ProDispose()        {            if (UnRegister != null)            {                UnRegister.UnRegister();            }            UnRegister = null;        }        private void OnDrawGizmos()        {            if (parabolaCurveType != CurveType.CustomizeCurve)            {                return;            }            if (BesselPath.controlPoints.Count < 4)            {                BesselPath.controlPoints.Add(Vector3.zero);                BesselPath.controlPoints.Add(new Vector3(-1, 1, -1));                BesselPath.controlPoints.Add(new Vector3(0, 0, 2));                BesselPath.controlPoints.Add(new Vector3(0, 0, 5));                return;            }            Gizmos.color = Color.blue;            // 绘制控制点            // 绘制曲线            Vector3 previousPoint = BesselPath.CalculatePoint(0) + transform.position;            int segments = 50;            for (int i = 1; i <= segments; i++)            {                float t = i / (float)segments;                Vector3 currentPoint = BesselPath.CalculatePoint(t) + transform.position;                // Gizmos.DrawSphere(currentPoint, 0.03f);                Gizmos.DrawLine(previousPoint, currentPoint);                previousPoint = currentPoint;            }        }#if UNITY_EDITOR        [CustomEditor(typeof(FxParabolaBulletLogic))]        public class MovableCoordinateEditor : Editor        {            void OnSceneGUI()            {                FxParabolaBulletLogic fxParabolaBulletLogic = target as FxParabolaBulletLogic;                if (fxParabolaBulletLogic.parabolaCurveType != CurveType.CustomizeCurve)                {                    return;                }                if (fxParabolaBulletLogic.BesselPath.controlPoints.Count < 4)                {                    return;                }                // 使用 Handles.PositionHandle 提供一个可拖动的控制柄                for (int i = 0; i < fxParabolaBulletLogic.BesselPath.controlPoints.Count; i++)                {                    EditorGUI.BeginChangeCheck();                    Vector3 newPosition = Handles.PositionHandle(                        fxParabolaBulletLogic.BesselPath.controlPoints[i] +                        fxParabolaBulletLogic.gameObject.transform.position,                        Quaternion.identity);                    if (EditorGUI.EndChangeCheck())                    {                        Undo.RecordObject(fxParabolaBulletLogic, "Move Coordinate");                        fxParabolaBulletLogic.BesselPath.controlPoints[i] =                            newPosition - fxParabolaBulletLogic.gameObject.transform.position;                    }                }            }        }#endif    }}
 |