Unity5では小さなスクリプトを追加するだけでオブジェクトが掴めるようになります。Unityのスクリプトは、OnMouseDown関数とOnMouseDrag関数で、マウスのクリックとドラッグ状態を検知できます。そのため、マウスクリックしたときに、マウスカーソルと対象オブジェクトの位置を正確に計算できれば、あとは対象のオブジェクトをマウスカーソルに合わせて移動させればよいだけです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using UnityEngine; using System.Collections; public class GrappleObject : MonoBehaviour { private Vector3 screenPoint; private Vector3 offset; void OnMouseDown () { // マウスカーソルは、スクリーン座標なので、 // 対象のオブジェクトもスクリーン座標に変換してから計算する。 // このオブジェクトの位置(transform.position)をスクリーン座標に変換。 screenPoint = Camera.main.WorldToScreenPoint (transform.position); // ワールド座標上の、マウスカーソルと、対象の位置の差分。 offset = transform.position - Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z)); } void OnMouseDrag () { Vector3 currentScreenPoint = new Vector3 (Input.mousePosition.x, Input.mousePosition.y, screenPoint.z); Vector3 currentPosition = Camera.main.ScreenToWorldPoint (currentScreenPoint) + this.offset; transform.position = currentPosition; } } |
このC#スクリプトの読むポイントとしては、Unityのシーン上にあるオブジェクトはワールド座標上にあり、マウスカーソルはスクリーン座標にある。という事を理解することです。スクリーン座標は単純に液晶モニターのXY座標です。ワールド座標は、無限に広がるXYZ座標で、ここにゲームオブジェクトが配置されています。
Unityでは、この座標系の変換がよくあります。特にマウスカーソル使う場合はよく変換します。変換には、Camera.main(カメラ)から取得できるWorldToScreenPointとScreenToWorldPointを使います。この変換処理はよく使われるので、Unityの場合は、Cameraからすぐアクセスできるようになっています。なので初心者の方はいきなりCameraが出てきて驚くかもしれません。
スクリプトの割り当て
上記スクリプトは、GrappleObjectなどの適当なクラス名で作成し保存して、対象のオブジェクトに割り当てるだけです。

デモ
ファースト・パーソンでプレイヤーを動かしながら、このスクリプトでオブジェクトを掴めました!
