Unityでタッチしたときの座標を

Input.mousePosition;

で取得すると、その座標はスクリーン座標と呼ばれる解像度と一致した値になります。例えば320×480の場合、左が0で右が320です。
この値を使ってUnityのオブジェクトを動かしたりしようとするとうまくいきません。
なぜなら、オブジェクトはワールド座標という3D空間の座標で位置が決まっているからです(おそらく中心が0, 0, 0となる)。

メテオストライク2をUnityで作ったときこのことを知らなくて、自前でスクリーン座標をワールド座標に計算して当てはめていました。
まあ、スケーリングの値やら、センタリングの値やらを計算に入れないとタッチしたところと激しくずれるので苦労した記憶があります。

でも、もう少し調べればわかることなのですが(といっても当時のUnityの知識では検索するワードすら思い浮かばない)、スクリーン座標をワールド座標に変換するメソッドがあったのです。

座標の種類

Unityの使用するカメラでは、3つの座標(スクリーン座標、ワールド座標、ビューポート座標)があります。 

  • スクリーン座標
  • 解像度と一致した座標です。解像度が640×480の場合、左が0で右が640です。マウスの座標はスクリーン座標で取得しているため、マウスの値を変換する場合に使います。

  • ワールド座標
  • 3D空間内の座標です(x:0, y:0, z:0)。

  • ビューポート座標
  • スクリーン座標の値を0〜1にした物です。

スクリーン座標をワールド座標(2D)へ変換する

Camera.main.ScreenToWorldPoint(Vector3 pos);

これを使うだけで簡単にスクリーン座標からワールド座標を取得できるのです。
スクリーン座標を引数にして、その戻り値がワールド座標になります。

まずはタッチしたときのスクリーン座標を取得

Vector3 screenPos = Input.mousePosition;

スクリーン座標からワールド座標を取得

Vector3 worldPos = Camera.main.ScreenToWorldPoint(screenPos);

ワールド座標をCavas座標へ変換する

まずはワールド座標からビューポート座標を取得

Vector3 screenPos = Camera.main.WorldToViewportPoint (worldPos);

Cavas座標にするときはワールド座標をビューポート座標に変換し、CanvasのRectTransformのサイズの1/2を引きます(座標の原点が違うため)

Vector2 WorldObject_ScreenPosition = new Vector2(
      ((screenPos.x * CanvasRect.sizeDelta.x) - (CanvasRect.sizeDelta.x * 0.5f)),
      ((screenPos.y * CanvasRect.sizeDelta.y) - (CanvasRect.sizeDelta.y * 0.5f)));

Canvas.anchoredPosition = WorldObject_ScreenPosition;

Camera.mainがnullのとき

メインカメラから「MainCamera」というタグが外れてしまっていると、Camera.mainがnullになってしまいます。
エラーが出た場合は確認してみましょう。

[参考]
http://tsubakit1.hateblo.jp/entry/2014/07/22/010739
http://qiita.com/tyfkda/items/b85dd075c715dfb52752