| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212 | using System.Collections.Generic;using UnityEngine;namespace CombatLibrary.CombatLibrary.CombatCore.Utility{    public struct ACurve    {        public List<CurveInfo> CurveInfos;        public CurveType CurveType;        public ACurve(CurveInfo[] curveInfos)        {            CurveInfos = new List<CurveInfo>();            CurveInfos.AddRange(curveInfos);            CurveType = CurveType.HYT;        }        public float Evaluate(float t)        {            if (CurveInfos == null)            {                return t;            }            if (CurveInfos.Count < 2)            {                return t;            }            switch (CurveType)            {                case CurveType.HYT:                    return HYT(t);                    break;                case CurveType.BSL:                    return BSL(t);                    break;            }            return 0;        }        public Vector2 EvaluateForVector2(float t,float currTime)        {            if (CurveInfos == null)            {                return new Vector2();            }            if (CurveInfos.Count < 2)            {                return new Vector2();            }            switch (CurveType)            {                // case CurveType.HYT:                //     // return HYT(t);                //     break;                case CurveType.BSL:                    return BSLForVector2(t, currTime);                    break;            }            return new Vector2();        }        private Vector2 BSLForVector2(float t,float currTime)        {            CurveInfo c1 = default;            CurveInfo c2 = default;            for (int i = 0; i < CurveInfos.Count; i++)            {                if (CurveInfos[i].BSLt > currTime)                {                    int lindex = i - 1;                    if (lindex < 0)                    {                        CurveInfo endInfo = CurveInfos[i];                        Vector2 endPos = new Vector2((float)endInfo.t, (float)endInfo.v);                        return endPos;                    }                    c1 = CurveInfos[i - 1];                    c2 = CurveInfos[i];                    break;                }            }            if (c2.t==0)            {                CurveInfo endInfo = CurveInfos[^1];                Vector2 endPos = new Vector2(endInfo.t, endInfo.v);                return endPos;            }            Vector2 pos1 = new Vector2((float)c1.t, (float)c1.v);            Vector2 pos2 = new Vector2((float)c1.it, (float)c1.ot);            Vector2 pos4 = new Vector2((float)c2.t, (float)c2.v);            Vector2 pos3 = new Vector2((float)c2.it, (float)c2.ot);            // float v11 = (float) c1.t;            // float v12 = (float) c1.v;            // float t11 = (float) c1.it;            // float t12 = (float) c1.ot;            //            // float v21 = (float) c2.t;            // float v22 = (float) c2.v;            // float t21 = (float) c2.it;            // float t22 = (float) c2.ot;            Vector2 a = Vector2.Lerp(pos1, pos2, t);            Vector2 b = Vector2.Lerp(pos2, pos3, t);            Vector2 c = Vector2.Lerp(pos3, pos4, t);            Vector2 d = Vector2.Lerp(a, b, t);            Vector2 e = Vector2.Lerp(b, c, t);            Vector2 f = Vector2.Lerp(d, e, t);            return f;        }        private float BSL(float t)        {            CurveInfo c1 = default;            CurveInfo c2 = default;            for (int i = 0; i < CurveInfos.Count; i++)            {                if (CurveInfos[i].t > t)                {                    int lindex = i - 1;                    if (lindex < 0)                    {                        return (float)CurveInfos[i].v;                    }                    c1 = CurveInfos[i - 1];                    c2 = CurveInfos[i];                    break;                }            }            if (c2.t == 0)            {                return (float)CurveInfos[^1].v;            }            Vector2 pos1 = new Vector2((float)c1.t, (float)c1.v);            Vector2 pos2 = new Vector2((float)c1.it, (float)c1.ot);            Vector2 pos4 = new Vector2((float)c2.t, (float)c2.v);            Vector2 pos3 = new Vector2((float)c2.it, (float)c2.ot);            // float v11 = (float) c1.t;            // float v12 = (float) c1.v;            // float t11 = (float) c1.it;            // float t12 = (float) c1.ot;            //            // float v21 = (float) c2.t;            // float v22 = (float) c2.v;            // float t21 = (float) c2.it;            // float t22 = (float) c2.ot;            Vector2 a = Vector2.Lerp(pos1, pos2, t);            Vector2 b = Vector2.Lerp(pos2, pos3, t);            Vector2 c = Vector2.Lerp(pos3, pos4, t);            Vector2 d = Vector2.Lerp(a, b, t);            Vector2 e = Vector2.Lerp(b, c, t);            Vector2 f = Vector2.Lerp(d, e, t);            return f.y;        }        private float HYT(float t)        {            CurveInfo c1 = default;            CurveInfo c2 = default;            for (int i = 0; i < CurveInfos.Count; i++)            {                if (CurveInfos[i].t > t)                {                    int lindex = i - 1;                    if (lindex < 0)                    {                        return (float)CurveInfos[i].v;                    }                    c1 = CurveInfos[i - 1];                    c2 = CurveInfos[i];                    break;                }            }            if (c2.t == 0)            {                return (float)CurveInfos[^1].v;            }            float ct = (float)c2.t - c1.t;            t = (t - c1.t) / ct;            float ot = c1.ot * ct;            float it = c2.it * ct;            float t2 = t * t;            float t3 = t2 * t;            float a = (2 * t3 - 3 * t2 + 1);            float b = t3 - 2 * t2 + t;            float c = t3 - t2;            float d = -2 * t3 + 3 * t2;            return a * c1.v + b * ot + c * it + d * c2.v;        }    }}
 |