using UnityEngine;
namespace DanroJump.Gameplay
{
///
/// Базовый класс collectible-предметов с trigger-контактом и защитой от повторного подбора.
///
[RequireComponent(typeof(Collider2D))]
public abstract class CollectibleBase : MonoBehaviour, ICollectible, IPlayerContactHandler
{
[SerializeField] private bool disableOnCollected = true;
///
/// Показывает, был ли предмет уже подобран в текущем цикле жизни объекта.
///
public bool IsCollected { get; private set; }
///
/// В редакторе автоматически переводит коллайдер предмета в trigger.
///
protected virtual void Reset()
{
if (TryGetComponent(out Collider2D collectibleCollider))
{
collectibleCollider.isTrigger = true;
}
}
///
/// При переиспользовании prefab сбрасывает состояние подбора.
///
protected virtual void OnEnable()
{
IsCollected = false;
}
///
/// Реагирует на вход игрока в trigger-зону предмета.
///
private void OnTriggerEnter2D(Collider2D other)
{
if (PlayerContactUtility.TryGetAlivePlayer(other, out var player))
{
HandlePlayerContact(player, this);
}
}
///
/// Обрабатывает контакт через общий интерфейс игровых объектов.
///
public void HandlePlayerContact(JumpPlayerController player, Component source)
{
Collect(player);
}
///
/// Применяет эффект предмета и при необходимости выключает объект.
///
public void Collect(JumpPlayerController player)
{
if (IsCollected || player == null || player.IsDead || player.IgnoresEnvironmentInteractions)
{
return;
}
IsCollected = true;
OnCollected(player);
if (disableOnCollected)
{
gameObject.SetActive(false);
}
}
///
/// Точка расширения для конкретного эффекта collectible.
///
protected virtual void OnCollected(JumpPlayerController player)
{
}
}
}