座標を変換する

マウスをクリックした位置の3D空間上の座標を取得する(Rayを飛ばす場合)

クリックした位置から座標を取得したい場合など、対象のz座標がわからない時にはRayを飛ばしてVector3の座標を取得します。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
void Update()
{
	if(Input.GetMouseButtonUp(0)) {
		RaycastHit hit;
		if (Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, 100)) {
			Vector3 target = hit.point;
			print(target);
		}
	}
}

マウスの位置の3D空間上の座標を取得する(対象のz座標がわかっている場合)

対象のz座標がわかる場合はカメラからScreenToWorldPointを利用してその座標を知る事も可能です。

1
2
3
4
5
6
void Update()
{
	float distance = Vector3.Distance (transform.position, Camera.main.transform.position);
	Vector3 target = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, distance));
	print(target);
}

マウスの位置の3D空間上の座標を取得する(カメラに映る最短距離のz座標)

Camera.main.nearClipPlaneで描画している一番手前のz座標が取得できますが、そのz座標上で取得する事も可能です。

1
2
3
4
void Update()
{
	Vector3 target = Camera.main.ScreenToWorldPoint (new Vector3 (Input.mousePosition.x, Input.mousePosition.y, Camera.main.nearClipPlane));
}

3D空間上の座標を2D空間上の座標に変換する

逆に3D空間上の座標から2Dの画面上の位置を取得するにはRectTransformUtility.WorldToScreenPointを利用して変換する事が可能です。

1
2
3
4
5
void Update()
{
	Vector2 target = RectTransformUtility.WorldToScreenPoint (Camera.main, transform.position);
	print(target);
}

Vector2で取得できる座標は左下が(0,0)となっているので、画像のように追従させる場合にはテキストオブジェクトのアンカーは左下に設定しておきましょう。