Poop obstacle pipeline working
This commit is contained in:
117
Assets/Scripts/Minigames/BirdPooper/Target.cs
Normal file
117
Assets/Scripts/Minigames/BirdPooper/Target.cs
Normal file
@@ -0,0 +1,117 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user