using UnityEngine; namespace Minigames.DivingForPictures { /// /// Collision behavior that grants temporary immunity and allows the player to phase through obstacles. /// During immunity, the player can pass through all obstacles without further collision detection. /// public class PlayerPhaseCollisionBehavior : PlayerCollisionBehavior { [Header("Phase Settings")] [Tooltip("Whether to disable the player's collider during immunity to allow phasing through obstacles")] [SerializeField] private bool disableColliderDuringImmunity = true; [Tooltip("How fast the player sprite blinks during phase mode (seconds between blinks)")] [SerializeField] private float visualFeedbackBlinkRate = 0.1f; private SpriteRenderer _spriteRenderer; private bool _originalColliderState; private bool _isBlinking; private float _blinkTimer; private Color _originalColor; private float _originalAlpha; protected override void Awake() { base.Awake(); // Get sprite renderer from player character if (playerCharacter != null) { _spriteRenderer = playerCharacter.GetComponent(); } if (_spriteRenderer != null) { _originalColor = _spriteRenderer.color; _originalAlpha = _originalColor.a; } if (playerCollider != null) { _originalColliderState = playerCollider.enabled; } } protected override void Update() { base.Update(); // Handle visual feedback blinking during immunity if (_isBlinking && _spriteRenderer != null) { _blinkTimer -= Time.deltaTime; if (_blinkTimer <= 0f) { // Toggle visibility Color currentColor = _spriteRenderer.color; currentColor.a = currentColor.a > 0.5f ? 0.3f : _originalAlpha; _spriteRenderer.color = currentColor; _blinkTimer = visualFeedbackBlinkRate; } } } protected override void CheckForCollisions() { // Override to skip collision detection entirely during immunity if collider is disabled if (isImmune && disableColliderDuringImmunity) { return; // Skip collision detection completely } base.CheckForCollisions(); } protected override void HandleCollisionResponse(Collider2D obstacle) { Debug.Log("[PlayerPhaseCollisionBehavior] Collision detected - entering phase mode"); // No immediate physical response - just start immunity period // The immunity will be handled by the base class } protected override void OnImmunityStart() { base.OnImmunityStart(); // Disable collider to allow phasing through obstacles if (disableColliderDuringImmunity && playerCollider != null) { playerCollider.enabled = false; Debug.Log("[PlayerPhaseCollisionBehavior] Collider disabled - entering phase mode"); } // Start visual feedback StartVisualFeedback(); } protected override void OnImmunityEnd() { base.OnImmunityEnd(); // Re-enable collider if (playerCollider != null) { playerCollider.enabled = _originalColliderState; Debug.Log("[PlayerPhaseCollisionBehavior] Collider re-enabled - exiting phase mode"); } // Stop visual feedback StopVisualFeedback(); } /// /// Starts the visual feedback to indicate immunity/phase mode /// private void StartVisualFeedback() { if (_spriteRenderer != null) { _isBlinking = true; _blinkTimer = 0f; // Start with reduced opacity Color immunityColor = _originalColor; immunityColor.a = 0.3f; _spriteRenderer.color = immunityColor; } } /// /// Stops the visual feedback and restores original appearance /// private void StopVisualFeedback() { _isBlinking = false; if (_spriteRenderer != null) { // Restore original color and alpha _spriteRenderer.color = _originalColor; } } /// /// Public method to toggle collider behavior during immunity /// public void SetColliderDisabling(bool disable) { disableColliderDuringImmunity = disable; } /// /// Check if player is currently in phase mode /// public bool IsPhasing => isImmune && disableColliderDuringImmunity; /// /// Manually trigger phase mode (useful for testing or special abilities) /// public void TriggerPhaseMode(float duration = -1f) { if (duration > 0f) { isImmune = true; immunityTimer = duration; OnImmunityStart(); } else { isImmune = true; immunityTimer = damageImmunityDuration; OnImmunityStart(); } } } }