Unityの実装で難しかったところのメモ
今回の問題点
ゲーム画面を壁で囲ったのだがゲームオブジェクトだと画面サイズの変化に対応できない。
UIにすれば解決するのだが、今回はブロック崩しを作りたいので壁に当たり判定も欲しい、UIにcolliderをつけてもゲーム画面の比率が変わったときに変わるのは見た目だけでcolliderの大きさは変わらない。
そこで解決策としてスクリーンサイズを取得し、それに合わせてオブジェクトの大きさを変える方法を考えた。
解決した方法
スクリーンサイズを取得し、カメラやオブジェクトの大きさを調整する。(これが最善かはわからない)
1. スクリーンサイズの取得
スクリーンサイズは以下のプログラムで取得可能
float w = Screen.width;
float h = Screen.height;
非常に簡単。これを用意した変数に入れれば自由に値を使える。
*備考*
上記の方法で入手できる値はゲーム画面のサイズなので、実行しているデバイスの画面サイズを取得したい場合はScreen.CurrentResolution.width, heightで取得できる。
2. 開発画面と画面サイズとの比率を求める
まず、開発画面の画面サイズを変数に入れる。
この例ではこんな感じ
const float defaultWidth = 2960;
const float defaultHeight = 1440;
開発画面のサイズは変更される予定がないのでconstで定数としておく。
次に実際に比率の計算
//開発画面のアスペクト比
float defaultAspect = defaultWidth / defaultHeight;
//実機でのアスペクト比
float realAspect = Screen.width / Screen.height;
//実機と開発画面の比率
float ratio = defaultAspect / realAspect;
あとはこの求めた比率を用いてオブジェクトやカメラのサイズをいじって、画面に合うようにしてあげればよい。
3. 実装
値を取得し計算ができたので実装したいのだがここで一つ問題がある。画面に合わせてオブジェクトのサイズを変更するとブロック崩しのボールが動くことができる領域の大きさも変わってしまう、これではデバイスによって挙動が変わってしまうのでよくない。
この解決策として壁のオブジェクトの大きさは変えずカメラを操作することで画面を調整する方法がよさそう。
今回のゲームは横持ちを想定しているので縦の幅がどのデバイスでも一致するようにカメラを調整する。そのため横の余白の広さはデバイスによって変わる。
この方法の注意点は余白が少なすぎると様々な画面サイズに対応できないという点である。
その対応としてUIでプレイヤーが操作するボタンやスティックを余白部分に設置しスペースの無駄をなくす。(画面の余白が少ない時にUIがボールが動く領域にはみ出さないように注意する必要はある)