15/04/15 17:38:49.53 A545dbfE.net
間違って.scの方に貼っちまった...こっちにもレスしとく
>>946-947
質問がよくわからないのでエスパーすると、関数名がUnityEngine.EventSystemsのハンドラなのでUIの話だと推定する。で、座標計算がおかしいのはルートCanvasのRenderModeが[Screen Space - Overlay]なのに座標変換をCamera.mainでやってるからだな多分。
まず座標系の変換はRectTransformUtility使うべし。第一引数のCameraは[Screen Space - Overlay]ならnull、それ以外なら所属するCanvasのworldCameraを使うこと。
以下書き直してみたサンプル。
public Vector3 prevPos;
public float fitHeight = 120;//フィット先指定は面倒なので簡略化
public void OnBeginDrag(PointerEventData ped) {
//開始時の座標をワールド座標で保持
prevPos = RectTransformUtility.WorldToScreenPoint(null,ped.position);
}
public void OnDrag(PointerEventData ped) {
//現在の座標をワールド座標で取得
Vector3 current = RectTransformUtility.WorldToScreenPoint(null,ped.position);
Vector3 movement = current - prevPos;//移動量は前の座標と現在の差分
Vector3 moveTo = transform.position;
moveTo.y += movement.y;//Y移動量を加える
transform.position = moveTo;
//現在の座標をワールド座標で保持
prevPos = current;
}
public void OnEndDrag(PointerEventData ped) {
//ピクセルで指定した場合のスクリーン座標で考える
Vector3 setpos = RectTransformUtility.WorldToScreenPoint(null,transform.position);
//適宜フィット先を決める
setpos.y = Mathf.Round (setpos.y/fitHeight)*fitHeight;
transform.position = RectTransformUtility.WorldToScreenPoint (null, setpos);
}