반응형
        protected IEnumerator ProcessProjectileParabolicAttack(EffectHandler skillEffect, Transform target, float delay = 0f)
        {
            if(delay > 0)
            {
                yield return new WaitForSeconds(delay);
            }
            
            skillEffect.InvokeEffect();

            var speed = UnitHandler.GetAnimationSpeed();

            var maximumHeightArrivalTime = fireTime / speed / 2F / 1000F; 
            var startPosition = skillEffect.transform.position;
            var endPosition = target.position;
            var maxHeight = Math.Max(startPosition.y, target.position.y) + Height;

            //높이가 음수 or 0이 되면 안된다.
            var mh = maxHeight - startPosition.y;

            var g = 2 * mh / (maximumHeightArrivalTime * maximumHeightArrivalTime);

            var vY = Mathf.Sqrt(2 * g * mh);

            //도착 지점 도달 시간
            //float a = g;
            //float b = -2 * vY;
            //float c = 2 * (endPosition.y - startPosition.y);
            //var dat = (-b + Mathf.Sqrt(b * b - 4 * a * c)) / (2 * a);
            
            var dat = fireTime / speed / 1000F ;

            //X축 속도
            var vX = -(startPosition.x - endPosition.x) / dat;

            var time = 0F;
           
            //vX = speed * vX;

            for (; ; )
            {
                time += Time.deltaTime;
                var tx = startPosition.x + vX * time;
                var ty = startPosition.y + (vY * time) - (0.5f * g * time * time);

                if(float.IsNaN(tx) == true)
                {
                    skillEffect.Clear();
                    break;
                }
                var tpos = new Vector3(tx, ty, 0);

                var angle = LookAt(skillEffect.transform.position, tpos);

                skillEffect.transform.position = tpos;
                skillEffect.transform.eulerAngles = new Vector3(0, 0, angle);

                var distance = skillEffect.transform.position - target.position;
                if (distance.sqrMagnitude <= 0.2F)
                {
                    skillEffect.Clear();
                    break;
                }
                //안전빵
                if(skillEffect.transform.position.y <= 0)
                {
                    skillEffect.Clear();
                    break;
                }
                yield return null;
            }
            yield break;
        }
        protected float LookAt(Vector3 obj, Vector3 lookObject)
        {
            var dir = lookObject - obj;
            if(dir.x < 0)
            {
                return Mathf.Atan2(obj.y - lookObject.y, obj.x - lookObject.x) * Mathf.Rad2Deg;
            }
            else
            {
                return Mathf.Atan2(lookObject.y - obj.y, lookObject.x - obj.x) * Mathf.Rad2Deg;
            }
        }
반응형

'개발관련 > Unity' 카테고리의 다른 글

해상도 고정  (0) 2023.09.02
TextMeshPro 폰트 생성  (0) 2023.07.31
클리커 게임 단위 구하기  (0) 2023.03.15
Addressables 동기 사용법 및 주의점  (0) 2022.09.12
could not create asset from file could not be read  (0) 2021.01.06

+ Recent posts