3Dオブジェクトをマウスでドラッグして移動する(3D空間)

オブジェクトの移動方法には様々な方法がありますが、今回は、マウスを使って移動させることを試してみましょう
空間に浮かぶオブジェクトを移動するため、奥行きの移動はマウスのホイールを回すことで実現します

実行結果

上下左右の動きはマウスでCubeをドラッグしながら動かすことで実現します
奥行きに動きは、マウスのホイールを回すことで実現します

シーン構成

Cube(移動させるオブジェクト)

移動させたいオブジェクトを作成します

スクリプト

Cubeにアタッチするコード

マネージャを作成してアタッチしてもいいですが、今回は単純化のためにCubeにアタッチします

using UnityEngine;

public class Move3DSpace : MonoBehaviour
{
    float objPosZ;

    private void Start()
    {
        objPosZ = transform.position.z;
    }

    void OnMouseDrag()
    {
        Vector3 objPos = Camera.main.WorldToScreenPoint(transform.position);

        Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, objPos.z);

        transform.position = Camera.main.ScreenToWorldPoint(mousePos);
    }

    private void Update()
    {
        float wheelValue = Input.GetAxis("Mouse ScrollWheel");

        if (wheelValue == 0)
        {
            return;
        }

        objPosZ += wheelValue;

        transform.position = new Vector3(transform.position.x, transform.position.y, objPosZ);
    }
}

解説

マウスがをドラッグ(左ボタンを押したまま)したときに呼ばれるイベントハンドラになります

void OnMouseDrag()

このスクリプトがアタッチされているCubeオブジェクトのワールド座標(3D空間の座標)をスクリーン座標に変換します

Vector3 objPos = Camera.main.WorldToScreenPoint(transform.position);

マウスの位置をスクリーン座標で取得しますが、スクリーン座標は2Dなので、先ほどのオブジェクトの座標をzの値として登録したものを使います

Vector3 mousePos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, objPos.z);

スクリーン座標からワールド座標に再度変換し直します
ただし、奥行き(z軸)は、オブジェクトの元の値を使っています

transform.position = Camera.main.ScreenToWorldPoint(mousePos);

マウスのホイール値を取得します
これは加速になっていて、回した時だけ値が出ます

float wheelValue = Input.GetAxis("Mouse ScrollWheel");

ホイールを回した時の値を現在のz軸の値に足します
移動量が奥行きの値に反映されることになります

objPosZ += wheelValue;

z軸の値を反映させたものをこのCubeオブジェクトの奥行きの値として再度セットします

transform.position = new Vector3(transform.position.x, transform.position.y, objPosZ);

参考

Unity

Posted by hidepon