118 lines
3.6 KiB
C#
118 lines
3.6 KiB
C#
using UnityEngine;
|
|
using UnityEngine.Events;
|
|
using AppleHillsCamera;
|
|
|
|
namespace Minigames.BirdPooper
|
|
{
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
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;
|
|
|
|
/// <summary>
|
|
/// Initialize target and set up event.
|
|
/// </summary>
|
|
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<Collider2D>(true);
|
|
foreach (Collider2D col in colliders)
|
|
{
|
|
if (!col.isTrigger)
|
|
{
|
|
col.isTrigger = true;
|
|
Debug.Log($"[Target] Set collider '{col.name}' to trigger");
|
|
}
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Override Update to stop movement when hit.
|
|
/// </summary>
|
|
protected override void Update()
|
|
{
|
|
if (isHit) return; // Don't move or check bounds if hit
|
|
|
|
base.Update();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns target move speed from settings.
|
|
/// </summary>
|
|
protected override float GetMoveSpeed()
|
|
{
|
|
return settings != null ? settings.TargetMoveSpeed : 4f;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Returns "Target" tag for collision detection.
|
|
/// </summary>
|
|
protected override string GetColliderTag()
|
|
{
|
|
return "Target";
|
|
}
|
|
|
|
/// <summary>
|
|
/// Trigger collision detection for both player and projectiles.
|
|
/// Single trigger collider handles both cases.
|
|
/// </summary>
|
|
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)
|
|
}
|
|
|
|
/// <summary>
|
|
/// Called when target is hit by a poop projectile.
|
|
/// Shows visual feedback and notifies manager.
|
|
/// </summary>
|
|
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);
|
|
}
|
|
}
|
|
}
|
|
|