簡単なドラッグアンドドロップの実装。実際にゲームで使う場合にはゲームごとの改変が必要と思いますが、ゼロから作るよりかなり気が楽と思います。
ChatGPT-4で出力したコードに、少し改変を加えたものです。
コード
DragAndDrop.cs
using UnityEngine; // ChatGPT-4 2023/3/20 public class DragAndDrop : MonoBehaviour { private Vector3 offset; private bool isDragging = false; // ドラッグするオブジェクト public GameObject draggableObject; // ドロップ先 public GameObject dropZone; Vector3 insideArea = new Vector3(1.2f, 1.2f, 1f); Vector3 outsideArea = new Vector3(1f, 1f, 1f); void Update() { if (isDragging) { Vector3 mousePos = Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 10f)); draggableObject.transform.position = mousePos + offset; if (dropZone.GetComponent<Collider2D>().bounds.Contains(draggableObject.transform.position)) { // ドロップ先を拡大して、配置可能な場所であることを示す dropZone.transform.localScale = insideArea; } else { dropZone.transform.localScale = outsideArea; } } } // ドラッグ開始 public void StartDrag() { isDragging = true; offset = draggableObject.transform.position - Camera.main.ScreenToWorldPoint(Input.mousePosition + new Vector3(0, 0, 10f)); } // ドラッグ終了 public void EndDrag() { isDragging = false; dropZone.transform.localScale = outsideArea; } }
コンポーネント(Inspector)
以下のコンポーネントが作成できます。
指定エリアには、それぞれスプライトを指定します。
定義ラベル | オブジェクトの種類 | 説明 |
---|---|---|
DraggableObject | Sprite | ドラッグアンドドロップで動かすオブジェクト |
DropZone | Sprite | ドラッグアンドドロップエリア※ |
※ドラッグアンドドロップエリア:このプログラムはエリア外でもオブジェクトを置けるようになっています。エリア内に入るとエリア表示が拡大します。エリアの大きさはコード内のinsideArea
、outsideArea
で定義されています。
オブジェクトと階層(Hierarchy)
階層(Hierarchy)
階層の指定はありませんが、UGUIコンポーネント(Imageなど)では動作しません。DraggableObject、DropZone、それぞれスプライトで作成します。
オブジェクトの設定
DraggableObject
側のゲームオブジェクトには EventTrigger
と BoxCollidor2D
、DropZone
側のゲームオブジェクトには BoxCollidor2D
を、それぞれアタッチします。
オブジェクト | 追加コンポーネント |
---|---|
DraggableObject(Sprite) | BoxCollidor2D、EventTrigger |
DropZone(Sprite) | BoxCollidor2D |
BoxCollidor2D
は追加設定は不要です。
EventTrigger
は以下の設定をします。
トリガ | コールバック |
---|---|
PointerDown | StartDrag() |
PointerUp | EndDrag() |
動作例
オブジェクトをドラッグアンドドロップできるようになります。
youtu.be