121 lines
3.8 KiB
C#
121 lines
3.8 KiB
C#
|
|
using UI.DragAndDrop.Core;
|
|||
|
|
using UnityEngine;
|
|||
|
|
|
|||
|
|
namespace UI.CardSystem.DragDrop
|
|||
|
|
{
|
|||
|
|
/// <summary>
|
|||
|
|
/// Booster pack specific implementation of DraggableObject.
|
|||
|
|
/// Manages booster pack behavior and opening logic.
|
|||
|
|
/// </summary>
|
|||
|
|
public class BoosterPackDraggable : DraggableObject
|
|||
|
|
{
|
|||
|
|
[Header("Booster Pack Settings")]
|
|||
|
|
[SerializeField] private bool canOpenOnDrop = true;
|
|||
|
|
[SerializeField] private bool canOpenOnDoubleClick = true;
|
|||
|
|
|
|||
|
|
[Header("Tap to Open")]
|
|||
|
|
[SerializeField] private bool canTapToOpen = true;
|
|||
|
|
[SerializeField] private int maxTapsToOpen = 3;
|
|||
|
|
|
|||
|
|
// Events
|
|||
|
|
public event System.Action<BoosterPackDraggable> OnBoosterOpened;
|
|||
|
|
public event System.Action<BoosterPackDraggable, int, int> OnTapped; // (booster, currentTap, maxTaps)
|
|||
|
|
public event System.Action<BoosterPackDraggable> OnReadyToOpen; // Final tap reached
|
|||
|
|
|
|||
|
|
private bool _isOpening;
|
|||
|
|
private float _lastClickTime;
|
|||
|
|
private int _currentTapCount;
|
|||
|
|
|
|||
|
|
public bool IsOpening => _isOpening;
|
|||
|
|
public int CurrentTapCount => _currentTapCount;
|
|||
|
|
|
|||
|
|
protected override void OnPointerUpHook(bool longPress)
|
|||
|
|
{
|
|||
|
|
base.OnPointerUpHook(longPress);
|
|||
|
|
|
|||
|
|
// Handle tap-to-open logic (only when in slot and not dragged)
|
|||
|
|
if (canTapToOpen && !_wasDragged && !longPress && CurrentSlot != null)
|
|||
|
|
{
|
|||
|
|
_currentTapCount++;
|
|||
|
|
|
|||
|
|
OnTapped?.Invoke(this, _currentTapCount, maxTapsToOpen);
|
|||
|
|
|
|||
|
|
if (_currentTapCount >= maxTapsToOpen)
|
|||
|
|
{
|
|||
|
|
OnReadyToOpen?.Invoke(this);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return; // Don't process double-click if tap-to-open is active
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// Check for double click
|
|||
|
|
if (canOpenOnDoubleClick && !longPress && !_wasDragged)
|
|||
|
|
{
|
|||
|
|
float timeSinceLastClick = Time.time - _lastClickTime;
|
|||
|
|
|
|||
|
|
if (timeSinceLastClick < 0.3f) // Double click threshold
|
|||
|
|
{
|
|||
|
|
TriggerOpen();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
_lastClickTime = Time.time;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
protected override void OnDragEndedHook()
|
|||
|
|
{
|
|||
|
|
base.OnDragEndedHook();
|
|||
|
|
|
|||
|
|
// Optionally trigger open when dropped in specific zones
|
|||
|
|
if (canOpenOnDrop)
|
|||
|
|
{
|
|||
|
|
// Could check if dropped in an "opening zone"
|
|||
|
|
// For now, just a placeholder
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Trigger the booster pack opening animation and logic
|
|||
|
|
/// </summary>
|
|||
|
|
public void TriggerOpen()
|
|||
|
|
{
|
|||
|
|
if (_isOpening)
|
|||
|
|
return;
|
|||
|
|
|
|||
|
|
_isOpening = true;
|
|||
|
|
|
|||
|
|
OnBoosterOpened?.Invoke(this);
|
|||
|
|
|
|||
|
|
// The actual opening logic (calling CardSystemManager) should be handled
|
|||
|
|
// by the UI page or controller that manages this booster pack
|
|||
|
|
|
|||
|
|
// Visual feedback would be handled by the BoosterPackVisual
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Reset the opening state
|
|||
|
|
/// </summary>
|
|||
|
|
public void ResetOpeningState()
|
|||
|
|
{
|
|||
|
|
_isOpening = false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Reset tap count (useful when starting a new opening sequence)
|
|||
|
|
/// </summary>
|
|||
|
|
public void ResetTapCount()
|
|||
|
|
{
|
|||
|
|
_currentTapCount = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// <summary>
|
|||
|
|
/// Enable or disable tap-to-open functionality at runtime
|
|||
|
|
/// </summary>
|
|||
|
|
public void SetTapToOpenEnabled(bool enabled)
|
|||
|
|
{
|
|||
|
|
canTapToOpen = enabled;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|