動かしたいオブジェクトのTagを設定する
まずは、動かす対象を判別するためにタグを設定します。
今回は、Characterというタグを追加して判定を行います。
スクリプト
using UnityEngine;
public class DragAndDropController : MonoBehaviour
{
private Plane _plane; //オブジェクトをキャッチしたときのオブジェクト移動用
private bool _isCatch; //オブジェクトをキャッチしているか
private Transform _catchObject; //キャッチしているオブジェクト保存用
[SerializeField] private string _targetTag = "Character"; //RayのターゲットのTag
void Start()
{
_plane = new Plane(Vector3.up, Vector3.up); //Plane構造体を初期化(Planeの向き、Planeの原点)
}
void Update()
{
if (Input.GetMouseButtonDown(0))
{
Vector3 touchPos = Input.mousePosition; //クリックした時のマウスのポジションを取得
Ray ray = Camera.main.ScreenPointToRay(touchPos); //Rayを作成(カメラからのRay)
RaycastHit hit; //Rayが当たった時の戻り値
if (Physics.Raycast(ray, out hit, Mathf.Infinity)) //Rayを飛ばす
{
//Rayにターゲットのオブジェクトが当たったら
if (hit.transform.CompareTag(_targetTag))
{
_catchObject = hit.transform; //キャッチしたオブジェクトを保存
_isCatch = true; //キャッチ中のフラグを設定
}
}
}
if (_isCatch)
{
Vector3 touchPos = Input.mousePosition; //クリックした時のマウスのポジションを取得
Ray ray = Camera.main.ScreenPointToRay(touchPos); //Rayを作成(カメラからのRay)
float rayDistance; //planeと当たった時のRayの長さ
_plane.Raycast(ray, out rayDistance); //planeとRayの当たり判定
_catchObject.position = ray.GetPoint(rayDistance); //キャッチ中のオブジェクトの位置をplaneとRayの交点に設定
//マウスクリックを離したら
if (Input.GetMouseButtonUp(0))
{
_isCatch = false; //キャッチ状態を解除
}
}
}
}
Tagを設定したら、オブジェクトを移動させるためのスクリプトを実装します。
Planeについて
スクリプト上に出てくるPlaneは、ゲームオブジェクトのPlaneとは別物で、見えない壁としてRayとの当たり判定をとることが出来ます。
このスクリプトでは、RayとPlaneが当たった交点座標にゲームオブジェクトが移動するようになっています。
スクリプトをゲームオブジェクトにアタッチする
スクリプトを書いたら、空のゲームオブジェクトを作成して、先ほど作ったスクリプトをアタッチします。
これで、ゲームを実行してオブジェクトが動かせるようになっているか確認をして、問題がなければ作業は終了です!
お疲れさまでした!