うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】親 RectTransform 内でドラッグ可能な UI 要素を実装する方法

このスクリプトをUI要素にアタッチすることで、そのUI要素がドラッグ可能になり、親要素の範囲内で自由に移動できるようになります。

using UnityEngine;
using UnityEngine.EventSystems;
 
public class UIRectDraggable : UIBehaviour, IBeginDragHandler, IDragHandler
{
    private Vector2 _pointerPosition;
    private Vector3 _dragPosition;
    private RectTransform _rect;
    private RectTransform _parentRect;
 
    protected override void Awake()
    {
        _rect = transform as RectTransform;
        _parentRect = _rect.parent as RectTransform;
    }
 
    void IBeginDragHandler.OnBeginDrag(PointerEventData data)
    {
        _dragPosition = _rect.localPosition;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(_parentRect, data.position, data.pressEventCamera, out _pointerPosition);
    }
 
    void IDragHandler.OnDrag(PointerEventData data)
    {
        Vector2 localPointerPosition;
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(_parentRect, data.position, data.pressEventCamera, out localPointerPosition))
        {
            Vector3 offsetToOriginal = localPointerPosition - _pointerPosition;
            _rect.localPosition = _dragPosition + offsetToOriginal;
        }
        
        var localPosition = _rect.localPosition;
 
        var minPosition = _parentRect.rect.min - _rect.rect.min;
        var maxPosition = _parentRect.rect.max - _rect.rect.max;
 
        localPosition.x = Mathf.Clamp(_rect.localPosition.x, minPosition.x, maxPosition.x);
        localPosition.y = Mathf.Clamp(_rect.localPosition.y, minPosition.y, maxPosition.y);
 
        _rect.localPosition = localPosition;
    }
}