モバイル向けに作っていると割と困るのが、Input.touchesで取得した入力位置です。
これは Screen.width, Screen.height の大きさに依存するので、解像度が違う端末でのインタラクションがまちまちになってしまいます。
例えば解像度 1920x1080 の端末で1センチスワイプするのと、800x640の端末で1センチスワイプするのでは、倍以上の入力量になってしまう場合があります。
この状態で1920x1080を前提にプログラムを組んでしまうと、800x640の端末でまともに遊べない! なんてことになりかねません。
今回は、この入力量を補正する方法をまとめました。
画面の割合を使う
画面を0.0〜1.0の範囲にまるめ、相対的な移動距離を取得します。
例えば左端から画面3分の1だけ右にスワイプすると、0.3という数値が取得できます。
例として、PrevPosition という変数に移動開始地点を保存しておき、
Vector2 val = new Vector2( Input.touches[0].position.x - PrevPosition.x / Screen.width, Input.touches[0].position.y - PrevPosition.y / Screen.height ); Debug.Log("normalized x : "+val.x+", y : "+val.y);
で移動割合が出せます。
また、Touch.deltaPosition には直前のフレームでの移動量が入っているので、スクリーンの解像度で割ってやれば、1フレームごとの移動量(%)が取得できます。
Vector2 val = new Vector2( Input.touches[0].deltaPosition.x / Screen.width, Input.touches[0].deltaPosition.y / Screen.height ); Debug.Log("normalized x : "+val.x+", y : "+val.y);
まあ、あんまおすすめはしない方法です。
インチに補正する
指の物理的な移動距離をインチで計算します。
Screenクラスの Screen.dpi という変数に1インチの表示ピクセル数が入っているので、それを指の移動量(ピクセル)で割ればインチで求められます。
端末にかかわらず、指の物理的な移動量を出せるので、覚えておくと便利です。
Vector2 inch = new Vector2( Input.touches[0].deltaPosition.x / Screen.dpi, Input.touches[0].deltaPosition.y / Screen.dpi ); Debug.Log("inch dpi : "+Screen.dpi+", x : "+inch.x+", y : "+inch.y);
ただし、AndroidではDPIの計算方法が特殊なため、気をつける必要があります。(おおむね大丈夫だと思いますが)
http://forum.unity3d.com/threads/screen-dpi-on-android.414014/
Unity5.3でScreen.dpiの計算方法が変わっています。
ディスプレイの解像度を変える
Screen.SetResolution関数を使うと、端末の解像度を設定することができます。
これによってInput.touch で取得する値を、解像度の範囲におさめることができます。
端末の解像度を気にせずにすむので、一番楽チンかもしれません。