職場でUnityを使ってViveのステージを作っているが、家ではViveがないので動作確認しながら進めることができず不便。マウスで操作できるステージを作っておけばちょい変更でVive向けにできるのではと考え、マウスで3Dオブジェクトを操作するステージを作ることを試みる。
まずはマウスの位置情報を取り込むところから。ググってみると、Input.mousePositionとCamera.main.ScreenToWorldPointを使ってけっこう簡単にマウスの位置情報を取り込めるとあったので、やってみた。
Input.mousePositionでは、単純にPCの画面上のマウス座標を取得するだけ。Camera.main.ScreenToWorldPointを使うことで、それをUnityの世界の3D座標に変換してくれるらしい。書いたコードは↓。このスクリプトをPlaneオブジェクトにくっつけた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class mousePositionCheck : MonoBehaviour { Vector3 mouse; Vector3 mouse3d; // Use this for initialization void Start () { } // Update is called once per frame void Update () { mouse = Input.mousePosition; mouse3d = Camera.main.ScreenToWorldPoint(mouse); Debug.Log (mouse); Debug.Log (mouse3d); } } |
出力されるログを見ると、マウスのポインターの位置に合わせて、マウス座標は表示されているが、3D変換後の値がずっと同じ値。。なぜ?
どうやらz座標を補完してあげないと上手く動かないよう。
参考にしたサイト:https://gist.github.com/Buravo46/8367810
z座標をてきとうな値に設定すると(以下コードのmouse.z = 10f;の部分)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class mousePositionCheck : MonoBehaviour { Vector3 mouse; Vector3 mouse3d; // Use this for initialization void Start () { } // Update is called once per frame void Update () { mouse = Input.mousePosition; mouse.z = 10f; mouse3d = Camera.main.ScreenToWorldPoint(mouse); Debug.Log (mouse); Debug.Log (mouse3d); } } |
マウスの位置の変換が成功して、ログが出力されるようになった。Unityの3Dステージにも座標の変更が反映されているようだが、この辺りのロジックは不明。
マウスのカーソル的なものを3Dステージに反映させるために、スクリプトを少し変更。void Update()の最後にtransform.position = mouse3d;を追加。これまでは(何となく)Planeオブジェクトにスクリプトをくっつけていたが、そちらは取り除き、新しく作ったピンクのCubeに修正したスクリプトをくっつける。transform.position = mouse3dの意味は、「位置座標にmouse3dの座標を代入」。どのオブジェクトの位置座標というのを記載していないため、スクリプトをくっつけたオブジェクトの位置座標を指すことになるので、ピンクのCubeの位置座標に、マウスの位置座標が代入されることになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class mousePositionCheck : MonoBehaviour { Vector3 mouse; Vector3 mouse3d; // Use this for initialization void Start () { } // Update is called once per frame void Update () { mouse = Input.mousePosition; mouse.z = 10f; mouse3d = Camera.main.ScreenToWorldPoint(mouse); Debug.Log (mouse); Debug.Log (mouse3d); transform.position = mouse3d; } } |
マウスの位置に対応して、ピンクのCubeが動くようになった。これにもうちょっとスクリプトを付けていけば、マウスをコントローラー(ポインター)にして3Dオブジェクトを操作できるような気がする。