質問: スマホ向け縦持ちの2Dゲームを作っています。 3dゲームの時はTransform.LookAt(Transform)を使っていたのですが、 2dではLookAtは使えないようなので... スマホでCanvasのタッチ座標を取得し、Mathf.Atanを使って回転角度を指定しようと考えました。 まず、このCanvasのどこをタッチしたかを知るのに、Input.touchesのTouch.positionを利用しようと考えたのですが、 Input.touchesの位置情報は端末の解像度における位置のようで、Canvasの座標と一致せず、端末によって違う数値が出てしまいます。 今のところ思いつくのは Touch.position.x/Screen.Widthのように座標を比率で扱うことですが、 スケーリングでmatchに指定していない方(この場合height)は正確な位置が取得できません.... レイアウトは、画面全体を覆うCanvasを置いていて、この上にすべてのUI部品を置いています。 Canvasのスケーリングは Scale With Screen Size Canvas、Match Width or Heightで、matchをWidthに合わせています。 よろしくお願いします。
回答: こんな感じでどうでしょうか? ``` void Update () { if (Input.touchCount == 0) return; Vector3 basePosition = this.transform.position; // キャラクタ位置 Vector3 touchPosition = Input.GetTouch(0).position; // タッチ位置 Vector3 lookTargetPosition = Camera.main.ScreenToWorldPoint( touchPosition ); lookTargetPosition.z = basePosition.z; // 2Dの時はz位置を揃える this.transform.rotation = GetLookAt(basePosition, lookTargetPosition); } private Quaternion GetLookAt(Vector3 basePosition, Vector3 lookTargetPosition) { Vector3 diff = (lookTargetPosition - basePosition ).normalized; return Quaternion.FromToRotation( Vector3.up, diff ); } ``` Editorだとタッチでなくマウスになるので、 if (Input.GetMouseButton(0))やInput.mousePositionへ変更する必要がります。