using System; using System.Collections; using UnityEngine; /// /// 抛物线飞行投射物(支持终点落地下落特效) /// public class ParabolaFlyObject : MonoBehaviour { private Vector3 startPoint; private Vector3 endPoint; private float flyDuration; private float heightPeak; private Action onImpactCallback; private GameObject impactEffectPrefab; /// /// 初始化抛物线飞行 /// public void Launch(Vector3 start, Vector3 end, float duration, float height, GameObject impactPrefab = null, Action onImpact = null) { startPoint = start; endPoint = end; flyDuration = duration > 0.05f ? duration : 0.8f; heightPeak = height; impactEffectPrefab = impactPrefab; onImpactCallback = onImpact; transform.position = start; StartCoroutine(FlyRoutine()); } private IEnumerator FlyRoutine() { float elapsedTime = 0f; while (elapsedTime < flyDuration) { elapsedTime += Time.deltaTime; float t = Mathf.Clamp01(elapsedTime / flyDuration); // 水平线性插值 Vector3 currentPos = Vector3.Lerp(startPoint, endPoint, t); // 抛物线弧度 y 轴偏移:4 * h * t * (1 - t) currentPos.y += 4f * heightPeak * t * (1f - t); transform.position = currentPos; yield return null; } transform.position = endPoint; // 落地时生成冲击波特效 (明确带入 impactEffectPrefab.transform.rotation,保留 -90° 旋转使网格平铺地面) if (impactEffectPrefab != null) { Quaternion rot = impactEffectPrefab.transform.rotation; var effectGo = Instantiate(impactEffectPrefab, endPoint, rot); effectGo.transform.rotation = rot; // 显式给实例化后的对象二次确认 rotation Destroy(effectGo, 3.5f); // 3.5 秒后清理粒子 } onImpactCallback?.Invoke(); Destroy(gameObject); } }