ドラックアンドドロップ(drag and drop)でゲームオブジェクトを動かします。
ゲーム内でユーザーがドラッグ&ドロップ機能を使う場面は、
プレイヤーがアイテムを移動・装備させる際や、UI要素をカスタマイズして配置し直す際、
ゲーム内の建設やレベルデザインでオブジェクトを配置する際などがあります。
ドラッグ&ドロップを実装することでゲーム開発の幅が広がるので、習得したい機能の一つです。
本記事では、ゲームオブジェクトやCanvas全体、各UIの場合に分けてドラッグ&ドロップを実装します。
- Unityでドラッグアンドドロップを使用したい。
ゲームオブジェクトを移動
ゲームオブジェクトをユーザーのマウス入力から稼働できるようにします。
Hierarchyウィンドウから「2DObject>Sprites」で1つ選択します。
Gameオブジェクトが画面上に表示されない場合は、
CanvasとMain Cameraを調節する必要があります。
ソースコード
using UnityEngine;
public class DragObject : MonoBehaviour
{
private Vector3 offset;
private bool isDragging = false;
void OnMouseDown()
{
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
offset = transform.position - mousePosition;
isDragging = true;
}
void OnMouseDrag()
{
if (isDragging)
{
Vector3 mousePosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);
transform.position = mousePosition + offset;
}
}
void OnMouseUp()
{
isDragging = false;
}
}
解説
- 名前空間
UnityEngine:Unityエンジンのクラスやメソッドにアクセスするために必要です。
ゲームオブジェクトの操作やユーザー入力の処理など、Unityの基本機能を利用できます。
- フィールド(メンバ変数)
「offset」:オブジェクトの位置とマウスの位置の差分を保持します。差分を用いて、ドラッグ中のオブジェクトがマウスの位置に対して正しく動くようにします。
「isDragging」:オブジェクトが現在ドラッグ中であるかどうかを判定するフラグです。ドラッグ開始時にtrueに設定され、ドラッグ終了時にfalseに設定されます。
- OnMouseDownメソッド
マウスボタンが押されたときに呼び出されます。
マウスのスクリーン座標をワールド座標に変換し、その位置とオブジェクトの現在の位置との差分(オフセット)を計算して保存します。また、isDraggingフラグをtrueに設定してドラッグを開始します。
- OnMouseDragメソッド
マウスがドラッグされている間に毎フレーム呼び出されます。
isDraggingフラグがtrueの場合、現在のマウスのスクリーン座標をワールド座標に変換し、オフセットを加算してオブジェクトの新しい位置を計算し、その位置にオブジェクトを移動させます。
- OnMouseUpメソッド
マウスボタンが離されたときに呼び出されます。
isDraggingフラグをfalseに設定してドラッグを終了します。
実装
スクリプトを対象のゲームオブジェクトにアタッチします。
さらに、「Add Component」からCollider2Dと入力して、いずれか1つを追加します。
本製作では、「Box Collider2D」を採用しました。
プロジェクトを再生すると、Gameオブジェクトが動きます。
まとめ
ゲームオブジェクトをドラッグアンドドロップするには、OnMouseDown・Drag・UPの3つを使用します。
また、対称のオブジェクトにスクリプトをアタッチして、Collider2Dと追加すると稼働します。