【Unity】2Dゲームオブジェクトをマウスで掴んで動かすサンプル

2023年9月20日

2Dゲームオブジェクトをマウスで掴んで動かすサンプルになります

準備

2Dゲームオブジェクトを用意します
Box Collider 2D コンポーネントとRigidbody 2D コンポーネントを追加します
Rigidbody2DはKinematicにしておきます(transform .positionで移動させるため)

コード

using UnityEngine;

public class MouseDrag : MonoBehaviour
{
    private Vector3 offset;

    void OnMouseDown()
    {
        offset = gameObject.transform.position - GetMouseWorldPos();
    }

    void OnMouseDrag()
    {
        transform.position = GetMouseWorldPos() + offset;
    }

    private Vector3 GetMouseWorldPos()
    {
        Vector3 mousePos = Input.mousePosition;
        mousePos.z = -Camera.main.transform.position.z;
        return Camera.main.ScreenToWorldPoint(mousePos);
    }
}

コードの説明

private Vector3 offset;

マウスで掴んだゲームオブジェクトの中心座標と、マウスカーソルの座標の差分を格納する変数です。

void OnMouseDown()

マウスでゲームオブジェクトをクリックしたときに呼び出されるメソッドです。offset変数に、マウスカーソルとゲームオブジェクトの中心座標の差分を格納します。

void OnMouseDrag()

マウスでゲームオブジェクトをドラッグしているときに呼び出されるメソッドです。GetMouseWorldPos()メソッドを使ってマウスカーソルの座標をワールド座標に変換し、offset変数を足してゲームオブジェクトを移動させます。

private Vector3 GetMouseWorldPos()

マウスカーソルの座標をスクリーン座標からワールド座標に変換するメソッドです。Input.mousePositionでスクリーン座標を取得し、Camera.main.ScreenToWorldPoint(mousePos)でワールド座標に変換して返します。

スクリプトのアタッチ

ゲームオブジェクトを選択し、MouseDragスクリプトをアタッチします

ゲームを実行し、マウスでゲームオブジェクトをドラッグして移動できることを確認します

補足説明

Box Collider 2D

Box Collider 2Dコンポーネントを追加することで、2D物理演算エンジンによる当たり判定を設定できます。ここでは、Box Collider 2Dを使って、ゲームオブジェクトの当たり判定を設定します

Rigidbody 2D

Rigidbody 2Dコンポーネントを追加することで、2D物理演算エンジンによる物理挙動を設定できます。ここでは、Rigidbody 2Dを使って、ゲームオブジェクトの移動を制御します

Camera.main

Camera.mainは、シーンに存在するメインカメラを取得するためのプロパティです。GetMouseWorldPos()メソッドでは、マウスカーソルのスクリーン座標をワールド座標に変換する際に、カメラの位置を考慮する必要があります。そのため、Camera.main.transform.position.zを使って、カメラのZ座標を取得しています。

注意点

この方法は、1つのオブジェクトの移動に対してのみ使用可能です。複数のオブジェクトをマウスでドラッグして移動させる場合は、オブジェクトごとにMouseDragスクリプトを作成する必要があります

また、この方法ではマウスの左クリックでのみオブジェクトをドラッグできます。右クリックやマウスホイールなど、他のマウスイベントでドラッグしたい場合は、Input.GetMouseButton()関数を使って条件分岐する必要があります

Unity,学習

Posted by hidepon