15/04/15 18:51:57.01 A545dbfE.net
>>959
そこも間違ってるだろうが、スクリーン原点が違っても(949,-184,-4926)にぶっ飛ぶことはないだろ?だから座標計算間違ってるとエスパーしたんだ
それはそれとして>>958がめちゃめちゃ間違ってたので訂正しとく。ついでにRenderMode [Screen Space - Camera]に対応しといた。
public Vector3 prevPos;
public float fitHeight = 120;//フィット先指定は面倒なので簡略化(このピクセル数ごとにスナップ)
public Canvas canvas;//カメラ取得のためのキャンバス
public Camera uiCamera{get{return canvas==null||canvas.renderMode == RenderMode.ScreenSpaceOverlay ? null : canvas.worldCamera;}}
public void OnBeginDrag(PointerEventData ped) {
RectTransformUtility.ScreenPointToWorldPointInRectangle ((RectTransform)transform.parent,ped.position,uiCamera,out prevPos);//開始時の座標をワールド座標で保持
}
public void OnDrag(PointerEventData ped) {
Vector3 current = new Vector3();
RectTransformUtility.ScreenPointToWorldPointInRectangle ((RectTransform)transform.parent,ped.position,uiCamera,out current);//現在の座標をワールド座標で取得
Vector3 movement = current - prevPos;//移動量は前の座標と現在の差分
Vector3 moveTo = transform.position;
moveTo.y += movement.y*transform.parent.lossyScale.y;//Y移動量を加える
transform.position = moveTo;
prevPos = current;//現在の座標をワールド座標で保持
}
public void OnEndDrag(PointerEventData ped) {
Vector3 setpos = RectTransformUtility.WorldToScreenPoint(uiCamera,transform.position);//スクリーン座標で考える
setpos.y = Mathf.Round (setpos.y/(fitHeight*transform.parent.lossyScale.y))*(fitHeight*transform.parent.lossyScale.y);//適宜フィット先を決める
Vector3 fitPos = setpos;
RectTransformUtility.ScreenPointToWorldPointInRectangle ((RectTransform)transform.parent,setpos,uiCamera,out fitPos);
transform.position = fitPos;
}