using System; using Core; using Core.Lifecycle; using UnityEngine; namespace Minigames.Airplane.Targets { /// /// Represents a target in the airplane minigame. /// Detects airplane collisions and can be highlighted when active. /// [RequireComponent(typeof(Collider2D))] public class AirplaneTarget : ManagedBehaviour { #region Events /// /// Fired when this target is hit. Parameters: (AirplaneTarget target, GameObject airplane) /// public event Action OnTargetHit; #endregion #region Inspector Properties [Header("Target Configuration")] [Tooltip("Name of this target (for validation)")] [SerializeField] private string targetName = "Target"; [Header("Visual Feedback")] [Tooltip("Sprite renderer for visual feedback (optional)")] [SerializeField] private SpriteRenderer spriteRenderer; [Tooltip("Color when target is active")] [SerializeField] private Color activeColor = Color.yellow; [Tooltip("Color when target is inactive")] [SerializeField] private Color inactiveColor = Color.white; [Header("Debug")] [SerializeField] private bool showDebugLogs = false; #endregion #region Properties public string TargetName => targetName; private bool _isActive = false; public bool IsActive => _isActive; #endregion #region State private Collider2D _targetCollider; private Color _originalColor; #endregion #region Lifecycle internal override void OnManagedAwake() { base.OnManagedAwake(); // Cache components _targetCollider = GetComponent(); // Configure collider as trigger if (_targetCollider != null) { _targetCollider.isTrigger = true; } // Cache sprite renderer if not assigned if (spriteRenderer == null) { spriteRenderer = GetComponent(); } // Store original color if (spriteRenderer != null) { _originalColor = spriteRenderer.color; } } internal override void OnManagedStart() { base.OnManagedStart(); // Start as inactive SetAsActiveTarget(false); } #endregion #region Active State /// /// Set this target as active (highlighted) or inactive /// public void SetAsActiveTarget(bool active) { _isActive = active; // Update visual feedback if (spriteRenderer != null) { spriteRenderer.color = active ? activeColor : inactiveColor; } if (showDebugLogs) Logging.Debug($"[AirplaneTarget] {targetName} set to {(active ? "active" : "inactive")}"); } #endregion #region Collision Detection /// /// Detect when airplane enters trigger /// private void OnTriggerEnter2D(Collider2D other) { // Check if it's an airplane var airplane = other.GetComponent(); if (airplane != null) { if (showDebugLogs) Logging.Debug($"[AirplaneTarget] {targetName} hit by airplane: {other.gameObject.name}"); OnTargetHit?.Invoke(this, other.gameObject); } } #endregion #region Public Methods /// /// Reset target to original state /// public void Reset() { SetAsActiveTarget(false); } #endregion } }