※この記事は2016年当時に在籍していた某社内での(略)、日中は客先常駐業務、定時後は自社に戻って&土日は家でVRアプリ開発(ノーペイ)という二足のわらじとなったため、一連の記事(このSTG制作のことね!)およびSTG開発そのものを完全にストップしなければならなくなった。それでもVRアプリの案件獲得の確度が高いという話を聞かされていたため、ボーナスでまとめて返してもらえばいい、皆がそう思っていた。。。そしてプロトタイプが完成した時点で新メンバ(専任者)に引き継いだ。(続く)
背景
前回記事 : STG制作5 で、Unityエディタ上のアスペクト比と実際にスマホのアスペクト比が異なっていた場合、画面の縦方向だけが画面内に収まり、横方向については考慮されないことが分かった。
もう少し分かりやすく説明すると、当初は下記図の①~③のどれかになると思っていたのだが、実際は①のように縦方向のサイズはUnityエディタと同等となるが、横方向は表示領域が④拡張される(Unityエディタより横が広い場合)、または⑤カットされる(Unityエディタより横が狭い場合)という結果になった。
で、これの何がマズいのかと言うと、例えば「画面上の敵弾が全て得点アイテムに変化する」という仕様を考えた場合、画面のアスペクト比によって表示される弾数が異なってしまう、つまり横のサイズが大きいほど弾数が増えることとなり、同じプレイをしても得点が異なるという問題が発生する。
そこで、異なるアスペクト比の画面でも同一の動作をする画面構成を検討した。
他のゲームはどうなっているか?
サンプルとして某スマホ用STGの画面を下記に示す。
見ての通り、左右をマスクして表示しており、①のパターンを採用していることが分かった。
これが一般的な方法かは不明だが、一番簡単な実現方法と思われる。
なお余談だが、iPhoneでリリースする場合、マスク画像が黒一色だと申請NGとなるので要注意(そういう規約があるらしい)。壁紙画像のようなものでマスクするのがベターと思われる。
画面表示範囲の検討
実際の表示領域については、逆を言えば「指定の領域外のオブジェクトは表示しない→削除する(※)」と言い換えられる。
※消してはいけないオブジェクトもあるが、ここは弾の扱いに特化して記載している。
画面外に出たオブジェクトを削除する方法は、STG制作4 の「方法2」を応用すれば出来そうである。
一旦話を整理すると、
(1)カメラ座標は(0,0)で固定
→ カメラ位置は気にしなくてよい。
(2)画面表示領域の縦方向はワールド座標の-5.0~5.0で固定
→ -5.0~5.0の範囲で所望の値を決めればよい
(3)画面表示領域の横方向は実機のアスペクト比によって異なるので分からない
→ とりあえずFULL HDで収まる範囲にしてみるか・・・
となる。
サンプルコード
using UnityEngine;
using System.Collections;
public class autoDeleteOutOfArea : MonoBehaviour {
// Update is called once per frame
void Update () {
if (this.isOutOfArea()) {
Destroy (gameObject);
}
}
bool isOutOfArea() {
//指定のArea外だったらtrueを返す
if(transform.position.x <= -2.7f ||
transform.position.x >= 2.7f ||
transform.position.y <= -4.0f ||
transform.position.y >= 4.0f)
{
return true;
}
return false;
}
}
実行結果
表示範囲が分かりやすいように灰色の背景を付加して、弾が何処で消えるかを確認した。
結果として、領域外に出たら弾が削除されることを確認できた。
また、異なるアスペクト比でも取り敢えずは問題なく同等の動作をすることを確認できた(表示されている弾数が全て120個になっている)。
以上