using UnityEngine; namespace Minigames.Airplane.Interactive { /// /// Speed boost ring that increases airplane velocity when passed through. /// Can be used as collectible power-ups or checkpoint rings. /// [RequireComponent(typeof(Collider2D))] public class AirplaneSpeedRing : MonoBehaviour { [Header("Boost Configuration")] [SerializeField] private float velocityMultiplier = 1.5f; [SerializeField] private float boostDuration = 1f; [SerializeField] private bool oneTimeUse = true; [Header("Optional Constraints")] [SerializeField] private float minResultSpeed = 5f; [SerializeField] private float maxResultSpeed = 25f; [Header("Visual Feedback")] [SerializeField] private GameObject ringVisual; [SerializeField] private ParticleSystem collectEffect; [SerializeField] private AudioSource collectSound; [Header("Debug")] [SerializeField] private bool showDebugLogs; private bool hasBeenUsed; private void Awake() { // Ensure collider is trigger var collider = GetComponent(); if (collider != null) { collider.isTrigger = true; } } private void OnTriggerEnter2D(Collider2D other) { // Check if already used if (oneTimeUse && hasBeenUsed) return; // Check if it's an airplane var airplane = other.GetComponent(); if (airplane == null || !airplane.IsFlying) return; var rb = other.GetComponent(); if (rb == null) return; // Apply speed boost Vector2 boostedVelocity = rb.linearVelocity * velocityMultiplier; // Clamp to constraints float speed = boostedVelocity.magnitude; if (speed < minResultSpeed) { boostedVelocity = boostedVelocity.normalized * minResultSpeed; } else if (speed > maxResultSpeed) { boostedVelocity = boostedVelocity.normalized * maxResultSpeed; } rb.linearVelocity = boostedVelocity; // Mark as used hasBeenUsed = true; // Trigger effects PlayCollectEffects(); if (showDebugLogs) { Debug.Log($"[AirplaneSpeedRing] Boosted {other.name}: velocity={boostedVelocity.magnitude:F1}"); } // Hide or destroy ring if (oneTimeUse) { if (ringVisual != null) { ringVisual.SetActive(false); } else { Destroy(gameObject, collectEffect != null ? collectEffect.main.duration : 0.5f); } } } private void PlayCollectEffects() { // Play particle effect if (collectEffect != null) { collectEffect.Play(); } // Play sound if (collectSound != null) { collectSound.Play(); } } private void OnDrawGizmos() { // Visualize ring in editor Gizmos.color = hasBeenUsed ? Color.gray : Color.yellow; var collider = GetComponent(); if (collider != null) { Gizmos.DrawWireSphere(collider.bounds.center, collider.bounds.extents.magnitude); } } } }