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

2023年8月29日

以下は、Unityで3Dゲームオブジェクトをマウスで掴んで動かすサンプルの説明です。

動作概要

このサンプルは、マウスのドラッグ操作を利用して、3Dゲームオブジェクトを掴んで動かすことができます。具体的には、マウスの左ボタンを押している間、マウスの移動に応じてオブジェクトを移動させることができます。

実装方法

  1. 3Dオブジェクトを作成するまず、3Dオブジェクトを作成します。この例では、キューブを作成し、それをドラッグ操作で動かすことにします。キューブを作成するには、以下の手順を行います。
    1. Hierarchyビューで、Create3D ObjectCubeを選択します。
    2. 作成されたキューブを選択し、Inspectorビューで、TransformコンポーネントのPositionを適当に変更します。
  2. スクリプトを作成するキューブをドラッグ操作で動かすためのスクリプトを作成します。スクリプト名は任意のもので構いません。以下のコードをスクリプトに追加してください。
using UnityEngine;

public class DragObject : MonoBehaviour
{
    private Vector3 mOffset;
    private float mZCoord;

    void OnMouseDown()
    {
        mZCoord = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
        mOffset = gameObject.transform.position - GetMouseWorldPos();
    }

    private Vector3 GetMouseWorldPos()
    {
        Vector3 mousePoint = Input.mousePosition;
        mousePoint.z = mZCoord;

        return Camera.main.ScreenToWorldPoint(mousePoint);
    }

    void OnMouseDrag()
    {
        transform.position = GetMouseWorldPos() + mOffset;
    }
}
  1. スクリプトをオブジェクトにアタッチする作成したスクリプトを、作成したキューブオブジェクトにアタッチします。以下の手順を行います。
    1. シーンビューまたはHierarchyビューで、キューブオブジェクトを選択します。
    2. Inspectorビューで、Add Componentボタンをクリックします。
    3. 検索欄に「DragObject」と入力し、作成したスクリプトを選択します。
  2. 動作確認シーンを再生し、マウスの左ボタンを押して、キューブをドラッグしてみてください。マウスの移動に合わせて、キューブが移動していることが確認できます。

スクリプトの説明

上記のスクリプトでは、以下のような処理が行われています。

OnMouseDown()メソッド

マウスの左ボタンが押されたときに呼び出されます。このメソッド内で、マウスカーソルの位置を元に、キューブオブジェクトの位置を設定するために必要な情報を取得しています。

mZCoord = Camera.main.WorldToScreenPoint(gameObject.transform.position).z;
mOffset = gameObject.transform.position - GetMouseWorldPos();

まず、カメラの視点座標系で、キューブオブジェクトの位置を表すベクトルを計算しています。これにより、マウスカーソルの位置を元に、キューブオブジェクトの位置を設定するために必要な情報を取得することができます。

次に、マウスカーソルの位置を元に、キューブオブジェクトの位置を設定するために必要なオフセットを計算しています。このオフセットは、マウスカーソルがキューブオブジェクトの中心に重なっているときには(0, 0, 0)となり、マウスカーソルがオブジェクトの外側にあるときには、オブジェクトの中心からマウスカーソルまでの距離に応じて変化します。

GetMouseWorldPos()メソッド

マウスカーソルの位置を元に、カメラの視点座標系での座標を計算して、ワールド座標系での座標に変換します。

private Vector3 GetMouseWorldPos()
{
    Vector3 mousePoint = Input.mousePosition;
    mousePoint.z = mZCoord;

    return Camera.main.ScreenToWorldPoint(mousePoint);
}

Input.mousePositionは、マウスカーソルの位置を表すスクリーン座標系のベクトルです。このベクトルに、mZCoordをz座標として設定して、カメラの視点座標系での座標を計算します。最後に、Camera.main.ScreenToWorldPoint()メソッドを使って、カメラの視点座標系での座標をワールド座標系での座標に変換します。

OnMouseDrag()メソッド

マウスがドラッグされている間、常に呼び出されます。このメソッド内では、マウスカーソルの位置を元に、キューブオブジェクトの位置を更新しています

transform.position = GetMouseWorldPos() + mOffset;

GetMouseWorldPos()メソッドで求めたマウスカーソルの位置と、OnMouseDown()メソッドで求めたオフセットを加えた位置を、transform.positionで直接設定することで、キューブオブジェクトをドラッグして移動することができます。

まとめ

上記のサンプルスクリプトを使うことで、Unity上でマウスでオブジェクトを掴んで動かすことができます。また、このサンプルスクリプトをベースに、より複雑な動作を実現することもできます。

Unity

Posted by hidepon