Google

2012年10月27日土曜日

Unityでコインゲー開発:アスペクト比変化対処

大分前回から間が開いてますが、アスペクト比の問題について。
アスペクト比やドットの違いは以下の問題となって開発者を苦しめます。
  • 余計な場所が見えてしまう
  • 逆に大事な場所が見えない
  • バランスが取れなくなる
毎フレーム描画されてしまうOnGUIをiOSで使う人はいないと思われますが、ポリゴンで描かれたGUI系の処理も影響大です。
みんなどうやっているのか解らない、で締める記事も多いのですが、実際は以下のどれかになる可能性が高いです。
  • 見えても問題ない構成にする
  • 先日の記事のように仕切りを作る
  • サイズを動的に変更する
3D空間はカメラ等の工夫で比率が変わってもなんとかなると思います。
しかしマウスの入力位置やGUIのタップ位置、その他画面サイズに引っ張られる問題はちょっとだけ考慮が必要です。

例えば、320x480と想定した全体画面の中で、特定の比率を持ったエリアを作りたい場合。
現在の画面サイズ情報はScreen.widthやheightで入手できます。
ここから想定サイズからの比率を計算し、返す関数を作ればいいわけです。
例えば矩形だと以下のような感じになります。


private int w = 320;

private int h = 480;
private Rect rectifyRectScale(ref Rect pos)

{
Rect new_pos = new Rect();
new_pos.x = (pos.x / w) * Screen.width;
new_pos.y = (pos.y / h) * Screen.height;
new_pos.width = (pos.width / w) * Screen.width;
new_pos.height = (pos.height / h) * Screen.height;
return new_pos;
}


矩形だけでなくVector2でもx,yでも仕組みは一緒です。
Input.mousePosition等の入力があった瞬間にこういった関数で比率を計算すれば、UnityEditorで作業中にウィンドウサイズが変わっても動作に問題は出ません。
ただ、マウスの入力座標は下から上にかけて値が増加する3D概念の構成になっていますので、そこにだけは注意しましょう。

アンドロイドのようにスマホ別にサイズが違いすぎる環境なら、こういった比率計算をGUIの表示に施せば、見苦しくても画面上の比率は保てます。
もしくは先日公開したカメラの仕切りと組み合わせ、見えている範囲だけ比率を保つようにすればさらに見栄えの問題は減るでしょう。


今回は簡単な話なのでサンプルはありません。
次回はNGUIを応用する話です。

0 件のコメント:

コメントを投稿