using UnityEngine; using UnityEngine.Events; using AppleHillsCamera; namespace Minigames.BirdPooper { /// /// Target entity for Bird Pooper minigame. /// Inherits scrolling, anchoring, and despawn behavior from ScrollingEntity. /// Can be hit by poop projectiles for scoring. Player still dies on collision. /// public class Target : ScrollingEntity { [Header("Visual Feedback")] [SerializeField] private SpriteRenderer spriteRenderer; [SerializeField] private Color hitColor = Color.green; [Header("Events")] public UnityEvent onTargetHit; private bool isHit; /// /// Initialize target and set up event. /// public override void Initialize(float despawnX, ScreenReferenceMarker referenceMarker, CameraScreenAdapter cameraAdapter) { base.Initialize(despawnX, referenceMarker, cameraAdapter); isHit = false; // Initialize event if (onTargetHit == null) { onTargetHit = new UnityEvent(); } // Find and set all colliders to trigger (we use OnTriggerEnter2D) Collider2D[] colliders = GetComponentsInChildren(true); foreach (Collider2D col in colliders) { if (!col.isTrigger) { col.isTrigger = true; Debug.Log($"[Target] Set collider '{col.name}' to trigger"); } } } /// /// Override Update to stop movement when hit. /// protected override void Update() { if (isHit) return; // Don't move or check bounds if hit base.Update(); } /// /// Returns target move speed from settings. /// protected override float GetMoveSpeed() { return settings != null ? settings.TargetMoveSpeed : 4f; } /// /// Returns "Target" tag for collision detection. /// protected override string GetColliderTag() { return "Target"; } /// /// Trigger collision detection for both player and projectiles. /// Single trigger collider handles both cases. /// private void OnTriggerEnter2D(Collider2D other) { // Check for projectile collision if (other.CompareTag("Projectile") && !isHit) { OnHitByProjectile(); } // Player collision is handled by BirdPlayerController's OnTriggerEnter2D // (both have trigger colliders, so trigger occurs naturally) } /// /// Called when target is hit by a poop projectile. /// Shows visual feedback and notifies manager. /// public void OnHitByProjectile() { if (isHit) return; isHit = true; // Visual feedback if (spriteRenderer != null) { spriteRenderer.color = hitColor; } // Notify manager onTargetHit?.Invoke(); Debug.Log($"[Target] Hit by projectile at position {transform.position}"); // Destroy after brief delay for visual feedback Destroy(gameObject, 0.2f); } } }