| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101 | using CombatLibrary.CombatLibrary.CombatCore.Utility;using Fort23.Core;using UnityEngine;namespace Core.Utility{    public class Parabola3DPath : CObject    {        public Vector3 startPos;        public Vector3 targetPos;        public float gravity = 9.8f;        public Vector3 initialVelocity; // 物体的初始速度        public float totalFlightTime;        public float addY;        public Parabola3DPath()        {        }        public Parabola3DPath(Vector3 startPos, Vector3 targetPos)        {            SetPos(startPos, targetPos);        }        public void SetPos(Vector3 startPos, Vector3 targetPos)        {            this.startPos = startPos;            this.targetPos = targetPos;            CalculateInitialVelocity();        }        // 计算发射物体的初始速度和飞行时间        void CalculateInitialVelocity()        {            Vector3 startPosition = startPos;            Vector3 targetPosition = targetPos;            // 计算目标的水平距离和垂直高度差            float deltaX = targetPosition.x - startPosition.x;            float deltaY = targetPosition.y - startPosition.y;            float deltaZ = targetPosition.z - startPosition.z;                       // 计算水平距离(包括 X 和 Z 轴)            float horizontalDistance = Mathf.Sqrt(deltaX * deltaX + deltaZ * deltaZ);            // 计算飞行所需的时间            totalFlightTime = CalculateFlightTime(horizontalDistance+addY, deltaY);            // 计算发射的初速度            initialVelocity = CalculateInitialVelocityVector(deltaX, deltaZ, deltaY, totalFlightTime);        }        // 计算飞行时间        float CalculateFlightTime(float horizontalDistance, float deltaY)        {            // 使用物理公式来计算飞行时间:竖直分量的运动方程            // time = sqrt(2 * (deltaY + horizontalDistance * tan(45))) / gravity            float time = Mathf.Sqrt((2 * (deltaY + horizontalDistance * Mathf.Tan(Mathf.Deg2Rad * 45f))) / gravity);            return time;        }        // 计算初速度向量        Vector3 CalculateInitialVelocityVector(float deltaX, float deltaZ, float deltaY, float timeToTarget)        {            // 计算水平速度分量            float v_x = deltaX / timeToTarget; // X轴速度            float v_z = deltaZ / timeToTarget; // Z轴速度            // 垂直速度            float v_y = (deltaY + 0.5f * gravity * timeToTarget * timeToTarget) / timeToTarget;            // 初速度向量            Vector3 velocity = new Vector3(v_x, v_y, v_z);            return velocity;        }        public Vector3 GetPositionAtTime(float t)        {            t = t * totalFlightTime;            if (t > totalFlightTime)            {                t = totalFlightTime;            }            // 计算每个轴的位移            float deltaX = initialVelocity.x * t;            float deltaY = initialVelocity.y * t - 0.5f * gravity * t * t;            float deltaZ = initialVelocity.z * t;            // 返回当前位置            return new Vector3(startPos.x + deltaX, startPos.y + deltaY, startPos.z + deltaZ);        }        public override void ActiveObj()        {        }        public override void DormancyObj()        {        }    }}
 |