今回は、ゲーム中に出現するアイテム等のオブジェクトをマウスを使ってドラッグ&ドロップして動かす方法について紹介したいと思います。
【Unity3D】オブジェクトをドラッグ&ドロップして動かす方法
近年人気を博したママにゲームを隠された!のようなゲームでは、アイテムを動かすことで各ステージをクリアする仕様ですので、このようなゲームを作りたいと思っている方におすすめの内容かと思います。
手順
というわけで、下準備としてPlaneとCubeをそれぞれシーン上に配置します。
今回は、例としてCubeオブジェクトをマウスを使って動かすようにします。
CubeにはRigidbodyコンポーネントをアタッチしてインスペクターからUse Gravityのチェックを外しておきます。これは、Cubeを落下させないようにするためです。
今回は、Cubeなのでデフォルトで「BoxCollider」がアタッチされている状態ですが、独自で開発しているゲーム等のアイテムを動かしたい場合には、当たり判定が必要になるので何かしらのコライダーをアタッチしてください。
続いて、スクリプト「DragObject」を作成します。
using UnityEngine;
public class DragObject : MonoBehaviour
{
private Vector3 offset;
private Camera mainCamera;
private bool isDragging = false;
void Start()
{
mainCamera = Camera.main; // メインカメラを取得
GetComponent().isKinematic = true; // 物理影響を無視
}
void OnMouseDown()
{
// マウスをクリックした位置とオブジェクトの位置の差を記録
offset = transform.position - GetMouseWorldPosition();
isDragging = true;
}
void OnMouseDrag()
{
if (isDragging)
{
transform.position = GetMouseWorldPosition() + offset;
}
}
void OnMouseUp()
{
isDragging = false; // マウスを離したらドラッグ終了
}
Vector3 GetMouseWorldPosition()
{
// マウスのスクリーン座標を取得し、ワールド座標に変換
Vector3 mousePoint = Input.mousePosition;
mousePoint.z = mainCamera.WorldToScreenPoint(transform.position).z; // カメラからの距離を設定
return mainCamera.ScreenToWorldPoint(mousePoint);
}
}
スクリプトを作成したら、Cubeオブジェクトにアタッチします。
尚、他のオブジェクトにぶつかった際の挙動を考慮してKinematicをtrueにして物理影響を無視しています。
ゲームを実行して、ドラッグ&ドロップしてCubeが動くか確かめてみてください。
幅広いジャンルのゲーム開発において役立つ機能だと思うので、是非活用してください。