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);
ディスカッション
コメント一覧
まだ、コメントがありません