This commit is contained in:
2026-09-05 15:02:49 +08:00
parent fdaf4e2fa3
commit 54e8af08fd
4 changed files with 125 additions and 3 deletions
@@ -27,6 +27,14 @@ public class BullitMove : MonoBehaviour
public float distanceForMaxTurn = 1f; // 在此距离内达到最大转向速度
float hitDistance = 2f; // 命中判定距离
// ⭐ 三合一抛物线(正常炮台散射+锁定时,上下两颗子弹的弧线飞行)
// 出膛偏移0 → 中段鼓出到 parabolaAmplitude(弧线最高点)→ 命中前归零(三发收敛到同一条鱼)
Vector2 parabolaAxis = Vector2.right; // 横向鼓出方向(垂直于炮口→目标连线)
float parabolaAmplitude = 0f; // 最高点横向鼓出幅度(<=0 关闭抛物线)
float parabolaInitialDistance = 1f; // 开火时到目标的距离(进度基准)
float parabolaPrevLateral = 0f; // 上一帧横向偏移(子弹是增量移动,偏移按帧差叠加)
float parabolaBaseSpeed = 0f; // 降速前的原始速度(清理时恢复,防池化复用残留慢速)
// ----------------------------------------------------------------
// ⭐ 渲染层级:sortingOrder 优先于 z 深度排序,
// 2D 鱼/飞机设置了 sortingOrder 后会把默认 0 的子弹压在下面,
@@ -84,6 +92,41 @@ public class BullitMove : MonoBehaviour
vector3_startPosition = transform.position;
vector3_startPosition.z = -400;
currShowTime = 0f;
// 解锁同时清除抛物线,防止直线飞行时残留横向偏移
ClearParabola();
}
/// <summary>
/// ⭐ 三合一抛物线:子弹在追踪目标的轨迹上叠加横向正弦偏移——
/// 出膛偏移0 → 中段鼓出到 amplitude(弧线最高点)→ 命中前归零(和另外两发收敛到同一条鱼)。
/// lateralAxis=横向鼓出方向(垂直于炮口→目标连线),totalDistance=开火时到目标的距离。
/// bulletSpeed>0 时给这发子弹降速:子弹默认速度太快(如100)时全程飞行仅零点几秒,弧线根本看不清。
/// </summary>
public void SetParabola(Vector2 lateralAxis, float amplitude, float totalDistance, float bulletSpeed = 0f)
{
parabolaAxis = lateralAxis.sqrMagnitude > 0.0001f ? lateralAxis.normalized : Vector2.right;
parabolaAmplitude = amplitude;
parabolaInitialDistance = Mathf.Max(0.01f, totalDistance);
parabolaPrevLateral = 0f;
// ⭐ 降速拉长飞行时间,弧线才看得清;记录原始速度,清理时恢复
if (bulletSpeed > 0f)
{
if (parabolaBaseSpeed <= 0f)
parabolaBaseSpeed = moveSpeed;
moveSpeed = bulletSpeed;
}
}
/// <summary>清除抛物线状态(解锁/回池时调用):关偏移 + 恢复原速度</summary>
void ClearParabola()
{
parabolaAmplitude = 0f;
parabolaPrevLateral = 0f;
if (parabolaBaseSpeed > 0f)
{
moveSpeed = parabolaBaseSpeed;
parabolaBaseSpeed = 0f;
}
}
public void Init()
@@ -159,6 +202,19 @@ public class BullitMove : MonoBehaviour
// 沿当前方向移动
transform.position += transform.up * moveSpeed * Time.deltaTime;
// ⭐ 三合一抛物线:在追踪轨迹上叠加横向正弦偏移
// 进度按剩余距离算(dist=初始距离→0,dist=命中距离→1),命中前偏移正好归零,三发收敛到目标身上
if (parabolaAmplitude > 0f)
{
float range = parabolaInitialDistance - hitDistance;
float progress = range > 0.1f
? Mathf.Clamp01(1f - (distance - hitDistance) / range)
: 1f;
float lateralNow = parabolaAmplitude * Mathf.Sin(progress * Mathf.PI);
transform.position += (Vector3)parabolaAxis * (lateralNow - parabolaPrevLateral);
parabolaPrevLateral = lateralNow;
}
}
else
{