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 件のコメント:
コメントを投稿