uGUIオブジェクトをタッチしてズリズリと(ドラッグ&ドロップ)で移動させる

 ボタンやら画像などをオブジェクトを自由な場所に移動させたいときがある。ドラッグのことね。

1)インスペクターにEventTriggerを追加
2)EventTriggerにDragを追加

 ここまでやったら、あとは(2)で追加したEventTriggerのDragにコードに書いたイベントをアタッチすればよい。
 ドラッグしたら呼ばれるイベントを作ると言う事ね。以下、そのイベント内の解説。

 まず以下のように親のオブジェクト情報を取得しておこう。親のオブジェクト(OyaPanel)内に自分自身のオブジェクトがいるていで。

//親オブジェクト取得
OyaPanel = transform.parent.gameObject;
//親オブジェクトから矩形トランスフォームを取得
OyaPanelRect = OyaPanel.GetComponent<RectTransform>();

タッチ位置の取得したいとき。

Input.mousePosition

でとれるっぽい。だもんで以下のようにすれば TapPosにタッチしたとこの座標がはいる。

//タッチ位置を親のオブジェクトのルールに基づいて座標をきめる
Vector2 TapPos = OyaPanel.transform.InverseTransformPoint(Input.mousePosition);

 あとは取得したTapPosにX座標とY座標はいってるから、それをつかって自分自身オブジェクトを移動させる。

//計算で親オブジェクトにあった座標を求める、親のサイズを2で割ったものを加える
Vector2 ScreenPosition = new Vector2(
    (TapPos.x + (OyaPanelRect.sizeDelta.x * 0.5f)),
    (TapPos.y + (OyaPanelRect.sizeDelta.y * 0.5f))
);
//自分自身の移動
transform.position = ScreenPosition;

 ちなみに、親のRectTransform状態でなんか計算が変わる?今回は「親のサイズを2で割ったものを加える」的なことをしてる。じゃないと変な位置に吹っ飛んでしまう。

 勘だけど親オブジェクトのRectTransformの設定によっては「親のサイズを2で割ったものを加える」的なことをしなくてよいかもね。
 この辺は、よくわからんかった。

 単純に座標いれるだけで解決したらわかりやすくていいのにさぁ。なんかタッチ座標はワールド座標だかららしいよ、よくわからんけども。