A Unity drag-and-drop system for rearranging elements within vertical and horizontal layout groups. Features smooth dragging, automatic element swapping, and optional auto-scrolling when dragging near container edges.
- Drag and drop elements within
VerticalLayoutGroupandHorizontalLayoutGroup - Automatic element swapping when dragging over other elements
- Configurable swap distance threshold
- Auto-scrolling when dragging near scroll container edges
- Event system for tracking drag start, drag, and drag end
- Support for both
EventTriggerandMonoBehaviourinput handling - Works with any pivot configuration
- Unity 2021.3 or later
- Unity UI (uGUI) package
git clone https://github.com/manaporkun/LayoutElementDrag.gitCopy the contents of Assets/Scripts/ into your Unity project:
DraggableCard.cs- Core dragging logic for individual cardsDraggableCardHandle.cs- Input handler for drag eventsDraggableCardPanelBase.cs- Base class for drag-enabled containersScrollableCardPanel.cs- Extended container with auto-scroll supportHandlePointerEventHandler.cs- Alternative MonoBehaviour-based input handler
-
Create a Layout Group: Add a
VerticalLayoutGrouporHorizontalLayoutGroupto a UI GameObject. -
Add the Panel Script: Attach
DraggableCardPanelBase(orScrollableCardPanelfor scrollable containers) to the layout group GameObject. -
Create Draggable Cards: For each child element you want to be draggable:
- Add the
DraggableCardcomponent - Add the
DraggableCardHandlecomponent (can be on the same object or a child handle)
- Add the
-
Configure: Adjust the
swapDistanceThresholdonDraggableCardto control how close elements need to be before swapping.
-
Set up a
ScrollRectwith your layout group as the content. -
Use
ScrollableCardPanelinstead ofDraggableCardPanelBase. -
Create two RectTransform objects to define scroll trigger zones:
upRectTransform: Area that triggers upward/leftward scrollingdownRectTransform: Area that triggers downward/rightward scrolling
-
Assign the
ScrollRect, scrollbars, and trigger zones in the inspector.
The main component for making UI elements draggable.
// Public properties
DraggableCardPanelBase CardPanelBase { get; } // Parent panel reference
// Configurable fields (Inspector)
float swapDistanceThreshold = 10f; // Distance threshold for element swapping
int dragSortingOrder = 2; // Canvas sorting order during dragBase class for containers that hold draggable cards.
// Events
event Action<DraggableCardEventArgs> OnDragStartEvent;
event Action<DraggableCardEventArgs> OnDragEvent;
event Action<DraggableCardEventArgs> OnDragEndEvent;
// Properties
int GetChildCount { get; } // Number of child elements
LayoutGroup LayoutGroup { get; } // Reference to the layout groupEvent data passed to drag event handlers.
public struct DraggableCardEventArgs
{
public int StartIndex; // Original sibling index
public int EndIndex; // Current/final sibling index
public DraggableCard Card; // Reference to the dragged card
}Extended panel with auto-scroll functionality.
// Configurable fields (Inspector)
bool isVertical; // Layout orientation
float scrollSpeed; // Base scroll speed
ScrollRect scrollRect; // Reference to ScrollRect
RectTransform upRectTransform; // Scroll up/left trigger zone
RectTransform downRectTransform; // Scroll down/right trigger zone
Scrollbar verticalScrollbar; // Vertical scrollbar reference
Scrollbar horizontalScrollbar; // Horizontal scrollbar referencepublic class CardManager : MonoBehaviour
{
[SerializeField] private DraggableCardPanelBase cardPanel;
private void OnEnable()
{
cardPanel.OnDragStartEvent += HandleDragStart;
cardPanel.OnDragEndEvent += HandleDragEnd;
}
private void OnDisable()
{
cardPanel.OnDragStartEvent -= HandleDragStart;
cardPanel.OnDragEndEvent -= HandleDragEnd;
}
private void HandleDragStart(DraggableCardEventArgs args)
{
Debug.Log($"Started dragging card from index {args.StartIndex}");
}
private void HandleDragEnd(DraggableCardEventArgs args)
{
Debug.Log($"Card moved from {args.StartIndex} to {args.EndIndex}");
}
}Assets/
├── Scripts/
│ ├── DraggableCard.cs # Core drag logic
│ ├── DraggableCardHandle.cs # Input handling
│ ├── DraggableCardPanelBase.cs # Base container class
│ ├── ScrollableCardPanel.cs # Scrollable container
│ ├── HandlePointerEventHandler.cs # MonoBehaviour input fallback
│ └── RandomColor.cs # Demo utility
├── Prefabs/
│ └── Card.prefab # Sample card prefab
└── Scenes/
└── SampleScene.unity # Demo scene
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
This project is licensed under the MIT License - see the LICENSE file for details.
See CHANGELOG.md for version history.
