Files
AppleHillsProduction/Assets/Scripts/Minigames/Airplane/Targets/AirplaneTarget.cs
2025-12-04 15:10:20 +01:00

152 lines
4.2 KiB
C#

using System;
using Core;
using Core.Lifecycle;
using UnityEngine;
namespace Minigames.Airplane.Targets
{
/// <summary>
/// Represents a target in the airplane minigame.
/// Detects airplane collisions and can be highlighted when active.
/// </summary>
[RequireComponent(typeof(Collider2D))]
public class AirplaneTarget : ManagedBehaviour
{
#region Events
/// <summary>
/// Fired when this target is hit. Parameters: (AirplaneTarget target, GameObject airplane)
/// </summary>
public event Action<AirplaneTarget, GameObject> 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<Collider2D>();
// Configure collider as trigger
if (_targetCollider != null)
{
_targetCollider.isTrigger = true;
}
// Cache sprite renderer if not assigned
if (spriteRenderer == null)
{
spriteRenderer = GetComponent<SpriteRenderer>();
}
// Store original color
if (spriteRenderer != null)
{
_originalColor = spriteRenderer.color;
}
}
internal override void OnManagedStart()
{
base.OnManagedStart();
// Start as inactive
SetAsActiveTarget(false);
}
#endregion
#region Active State
/// <summary>
/// Set this target as active (highlighted) or inactive
/// </summary>
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
/// <summary>
/// Detect when airplane enters trigger
/// </summary>
private void OnTriggerEnter2D(Collider2D other)
{
// Check if it's an airplane
var airplane = other.GetComponent<Core.AirplaneController>();
if (airplane != null)
{
if (showDebugLogs) Logging.Debug($"[AirplaneTarget] {targetName} hit by airplane: {other.gameObject.name}");
OnTargetHit?.Invoke(this, other.gameObject);
}
}
#endregion
#region Public Methods
/// <summary>
/// Reset target to original state
/// </summary>
public void Reset()
{
SetAsActiveTarget(false);
}
#endregion
}
}