ゲーム化!tomo_manaのブログ

ゲーム化!tomo-manaのブログ

Unityでゲームを作る方法について紹介しています

Unity/C# ドラッグアンドドロップ

簡単なドラッグアンドドロップの実装。実際にゲームで使う場合にはゲームごとの改変が必要と思いますが、ゼロから作るよりかなり気が楽と思います。

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)

以下のコンポーネントが作成できます。

作成されるコンポーネント(Inspectorウィンドウ)


指定エリアには、それぞれスプライトを指定します。

定義ラベル オブジェクトの種類 説明
DraggableObject Sprite ドラッグアンドドロップで動かすオブジェクト
DropZone Sprite ドラッグアンドドロップエリア※


ドラッグアンドドロップエリア:このプログラムはエリア外でもオブジェクトを置けるようになっています。エリア内に入るとエリア表示が拡大します。エリアの大きさはコード内のinsideAreaoutsideAreaで定義されています。

オブジェクトと階層(Hierarchy)

階層(Hierarchy)
階層の指定はありませんが、UGUIコンポーネント(Imageなど)では動作しません。DraggableObject、DropZone、それぞれスプライトで作成します。

Spriteの作成(2D Object → Sprites)


オブジェクトの設定
DraggableObject側のゲームオブジェクトには EventTriggerBoxCollidor2DDropZone側のゲームオブジェクトには BoxCollidor2D を、それぞれアタッチします。

オブジェクト 追加コンポーネント
DraggableObject(Sprite) BoxCollidor2D、EventTrigger
DropZone(Sprite) BoxCollidor2D


BoxCollidor2Dは追加設定は不要です。

BoxCollidor2Dの設定(デフォルト)


EventTriggerは以下の設定をします。

トリガ コールバック
PointerDown StartDrag()
PointerUp EndDrag()
EventTriggerの設定(DraggableObject)