ドラッグでUIを移動させるスクリプト
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はドラッグ中に呼び出される
これを適当なオブジェクトにアタッチしてドラッグすると
マウスのドラッグに合わせて移動させたいのでOnDrag内をこのように記述
public void OnDrag(PointerEventData eventData) { Vector3 TargetPos = Camera.main.ScreenToWorldPoint (eventData.position); TargetPos.z = 0; transform.position = TargetPos; }
なかなかいい感じ
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); } }
これで燃えるゴミにちり紙を出せるようになった
特定オブジェクト下でのみドロップするようにしたいなら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); } }
OnEndDragはドラッグしたオブジェクト上で呼び出され、OnDropは終了地点の手前にあるオブジェクトのものが呼び出されるみたい(たぶん)
今回はここまで
脱出ゲームに使えそうだと思いました