Stash work!

This commit is contained in:
Michal Pikulski
2025-11-17 17:10:24 +01:00
parent c6f635f871
commit b5364a2bbc
29 changed files with 665 additions and 2444 deletions

View File

@@ -243,6 +243,10 @@ namespace UI.DragAndDrop.Core
public virtual void OnDrag(PointerEventData eventData)
{
// Just ship all this shit when disabled
if (!_isDraggingEnabled)
return;
if (!_isDragging)
return;
@@ -269,6 +273,9 @@ namespace UI.DragAndDrop.Core
public virtual void OnEndDrag(PointerEventData eventData)
{
if (!_isDraggingEnabled)
return;
if (!_isDragging)
return;
@@ -282,14 +289,7 @@ namespace UI.DragAndDrop.Core
if (_canvasGroup != null)
_canvasGroup.blocksRaycasts = true;
// Find closest slot and snap
FindAndSnapToSlot();
// Snap base rotation back to slot rotation (if in a slot)
if (_currentSlot != null)
{
Tween.Rotation(transform, _currentSlot.transform.rotation, 0.3f, 0f, Tween.EaseOutBack);
}
// No auto-slotting - derived classes handle placement logic via OnDragEndedHook()
OnDragEnded?.Invoke(this);
OnDragEndedHook();
@@ -344,70 +344,8 @@ namespace UI.DragAndDrop.Core
#region Slot Management
protected virtual void FindAndSnapToSlot()
{
SlotContainer[] containers = FindObjectsByType<SlotContainer>(FindObjectsSortMode.None);
DraggableSlot closestSlot = null;
float closestDistance = float.MaxValue;
// Use RectTransform.position for overlay, transform.position for others
Vector3 myPosition = (_canvas != null && _canvas.renderMode == RenderMode.ScreenSpaceOverlay && RectTransform != null)
? RectTransform.position
: transform.position;
foreach (var container in containers)
{
DraggableSlot slot = container.FindClosestSlot(myPosition, this);
if (slot != null)
{
Vector3 slotPosition = slot.RectTransform != null ? slot.RectTransform.position : slot.transform.position;
float distance = Vector3.Distance(myPosition, slotPosition);
if (distance < closestDistance)
{
closestDistance = distance;
closestSlot = slot;
}
}
}
if (closestSlot != null)
{
// Check if slot is occupied
if (closestSlot.IsOccupied && closestSlot.Occupant != this)
{
// Swap with occupant
SwapWithSlot(closestSlot);
}
else
{
// Move to empty slot
AssignToSlot(closestSlot, true);
}
}
else if (_currentSlot != null)
{
// Return to current slot if no valid slot found
SnapToCurrentSlot();
}
}
protected virtual void SwapWithSlot(DraggableSlot targetSlot)
{
DraggableSlot mySlot = _currentSlot;
DraggableObject otherObject = targetSlot.Occupant;
if (otherObject != null)
{
// Both objects swap slots
targetSlot.Vacate();
if (mySlot != null)
mySlot.Vacate();
AssignToSlot(targetSlot, true);
if (mySlot != null)
otherObject.AssignToSlot(mySlot, true);
}
}
// Auto-slotting removed - derived classes (Card, etc.) handle placement via state machines
// AssignToSlot() and SnapToSlot() kept for explicit slot assignment
public virtual void AssignToSlot(DraggableSlot slot, bool animate)
{
@@ -461,14 +399,6 @@ namespace UI.DragAndDrop.Core
}
}
protected virtual void SnapToCurrentSlot()
{
if (_currentSlot != null)
{
SnapToSlot(_currentSlot);
}
}
#endregion
#region Selection