このスクリプトを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; } }