個人的勉強メモ置き場

プログラミングど素人のメモ置き場

ドラッグでUIを移動させるスクリプト

f:id:zykb:20200803014441g:plain

uGUIをドラッグで移動させる

今回はマウスのドラッグに合わせてペットボトルやゴミを指定領域にドロップしたら消すという形にしたい

uGUIをドラッグで移動させるにはIDragHandler.OnDragを使います

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class DragTest : MonoBehaviour, IDragHandler
{
    public void OnDrag(PointerEventData eventData)
    {
        Debug.Log("ドラッグ中");
    }
}


OnDragはドラッグ中に呼び出される
これを適当なオブジェクトにアタッチしてドラッグすると


f:id:zykb:20200803020434p:plain


マウスのドラッグに合わせて移動させたいのでOnDrag内をこのように記述

    public void OnDrag(PointerEventData eventData)
    {
        Vector3 TargetPos = Camera.main.ScreenToWorldPoint (eventData.position);
		TargetPos.z = 0;
		transform.position = TargetPos;
    }

f:id:zykb:20200803022005g:plain


なかなかいい感じ
Canvas設定がスクリーンスペース-オーバーレイの場合は素直に

    transform.position = eventData.position
ドロップ処理

ドラッグに合わせてオブジェクトを移動させることが出来たのでドロップ処理を作る

オブジェクトがドロップを取得したときに呼び出されるIDropHandler.OnDropを使うと良さそう

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class DragTest : MonoBehaviour, IDragHandler, IDropHandler
{
    public void OnDrag(PointerEventData eventData)
    {
        Vector3 TargetPos = Camera.main.ScreenToWorldPoint (eventData.position);
	TargetPos.z = 0;
	transform.position = TargetPos;
    }

    public void OnDrop(PointerEventData eventData)
    {
        Destroy(gameObject);
    }
}

f:id:zykb:20200803071450g:plain


これで燃えるゴミにちり紙を出せるようになった

特定オブジェクト下でのみドロップするようにしたいならEventSystem.current.RaycastAllを使うとオブジェクト位置にあるUIを全て取得できるので後はタグなどで判断しよう

        var raycastResults = new List<RaycastResult>(); 
        EventSystem.current.RaycastAll(pointerEventData, raycastResults);
        foreach(var hit in raycastResults)
        {
            if (hit.gameObject.CompareTag ( " tag名" ))
            {
                // 処理
            }
        }

ちなみにOnDropの他にもOnEndDragというものもあり、こちらはドラッグの終了時に呼び出されるので代わりに用いても同じように出来る


………??

OnDropとOnEndDragの違い


Unity公式によると

IEndDragHandler - OnEndDrag - ドラッグが終了したときドラッグ対象オブジェクトで呼び出されます
IDropHandler - OnDrop - ドラッグを止めた場所にあるオブジェクト上で呼び出されます

OnDropはドラッグを終了した地点にあるオブジェクト上で呼び出されるみたいなので燃えるゴミにもこちらのスクリプトをつけてみる

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

public class DropTest : MonoBehaviour, IDropHandler
{
    public void OnDrop(PointerEventData eventData)
    {
        Destroy(gameObject);
    }
}
f:id:zykb:20200803075946g:plain
Paper手前 Burn奥
f:id:zykb:20200803080150g:plain
Paper奥 Burn手前

OnEndDragはドラッグしたオブジェクト上で呼び出され、OnDropは終了地点の手前にあるオブジェクトのものが呼び出されるみたい(たぶん)


今回はここまで
脱出ゲームに使えそうだと思いました