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) { } } }