2015年3月24日火曜日

Asset MobileSingleStickControlのバーチャルスティックのズレ

Asset MobileSingleStickControlのバーチャルスティックが消える
の続き

今回は、バーチャルスティックを左だろうと下だろうとどう動かしても
右上に入力されていることになってしまっていた。

原因は、画面に対して描画領域を比率で固定し、黒帯表示を行っていたから。
タッチした画面の座標を Canvas の座標に変換してやらないとならない。


対策として、スクリプト Joystick 内の OnDrag() を編集した。
以下、変更部分のソース。
※補足1:Canvas Scalerで900 x 600 (3:2画面) と設定していた例
※補足2:MobileJoystick の RectTransform は左下をアンカーの基準にする。


  public void OnDrag(PointerEventData data)
  {
   Vector3 newPos = Vector3.zero;
   if (m_UseX)
   {
                //ここからが書き換えた部分
                int nWidth = Screen.width;
                int obi = 0;
                if ((Screen.width * 2) > (Screen.height * 3)) //左右に黒帯ができる場合
                {
                    nWidth = (int)(Screen.height * 1.5f); //黒帯を除いた描画幅を取得
                    obi = (int)((Screen.width - nWidth) / 2f); //黒帯の片側の大きさを取得
                }
                int delta = (int)((data.position.x - obi) / nWidth * 900f - m_StartPos.x); //座標空間の変換
                //ここまでが書き換えた部分
    delta = Mathf.Clamp(delta, - MovementRange, MovementRange);
    newPos.x = delta;
   }
   if (m_UseY)
   {
                //ここからが書き換えた部分
                int nHeight = Screen.height;
                int obi = 0;
                if ((Screen.width * 2) < (Screen.height * 3)) //上下に黒帯ができる場合
                {
                    nHeight = (int)(Screen.width * 0.667f);
                    obi = (int)((Screen.height - nHeight) / 2f);
                }
                int delta = (int)( (data.position.y - obi)/ nHeight  * 600f - m_StartPos.y);
                //ここまでが書き換えた部分
                delta = Mathf.Clamp(delta, -MovementRange, MovementRange);
    newPos.y = delta;
   }
   transform.GetComponent<RectTransform>().anchoredPosition3D = new Vector3(m_StartPos.x + newPos.x, m_StartPos.y + newPos.y, m_StartPos.z + newPos.z);
   UpdateVirtualAxes(transform.GetComponent<RectTransform>().anchoredPosition3D);
  }



描画領域の比率を変更することはそうそうないだろうけど、
これからStart()でCanvasScalerから持ってくるように変更しよう。

0 件のコメント:

コメントを投稿