暇つぶし2chat GAMEDEV
- 暇つぶし2ch1005:名前は開発中のものです。
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);
}


次ページ
続きを表示
1を表示
最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch