1
This commit is contained in:
@@ -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
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user