うにてぃブログ

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

【Unity】uGUI の要素をドラッグする

uGUI のドラッグするためには IDragHandler, IBeginDragHandler, IEndDragHandler
の3つの interface を継承してやる必要があります

これを継承していると Eventsystem が勝手に OnDrag, OnBeginDrag, OnEndDrag を呼び出ししてくれます



ドラッグを反映させる

f:id:hacchi_man:20200502231231g:plain

Canvas Overlay

OnDrag で、eventData.deltaanchoredPosition に加算してやるだけで
簡単にドラッグ処理をさせることができます

しかしこれは Canvas が Overlay の場合のみしか利用できません

Canvas が Overlay以外

RectTransformUtility.ScreenPointToLocalPointInRectangle を利用して、
タップした位置をローカル座標に変換する必要があります

Canvas

using UnityEngine;
using UnityEngine.EventSystems;

public class UGUIDragSample : MonoBehaviour, IDragHandler, IBeginDragHandler, IEndDragHandler
{
    private RectTransform _rectTransform;
 
    private void Awake()
    {
        _rectTransform = transform as RectTransform;   
    }
    
    public void OnDrag(PointerEventData eventData)
    {
        // Overlay の場合
        _rectTransform.anchoredPosition += eventData.delta;

        // それ以外の場合
        Vector2 outPos = Vector2.zero;
        RectTransformUtility.ScreenPointToLocalPointInRectangle(
                (RectTransform) _rectTransform.parent,
                eventData.position,
                eventData.pressEventCamera,
                out outPos);
            
        _rectTransform.localPosition = outPos;
    }
 
    public void OnBeginDrag(PointerEventData eventData)
    {
    }
 
    public void OnEndDrag(PointerEventData eventData)
    {
    }
}