こんにちは、うら干物です。
今回は、先日参加した福島GameJamで作成したゲームのバグについて追っていきましょう。
当日は時間がなくてバグを追うことも修正することもできませんでしたが、バグをそのままにしておくわけにはいきません。
しっかり原因を究明して、次のゲーム作りに活かしましょう!
この記事にはUnity5.4.0f3を使用しています。
シューティングゲームのUIが画面中央に寄りすぎ
うーん、何故かUIが画面中央に寄っちゃってますね。
少なくとも望んだ画面の形ではありませんね。
なにが原因なのでしょうか。
RectTransformのアンカーポジション設定
UGUIのCanvas以下で使われるオブジェクトは通常のTransformとは別にRectTransformを使った座標指定をすることができます。
RectTransformではアンカー基準点となる地点からの位置を指定することができ、画面中央のほかに画面左端や右端を基準点とすることでスクリーンサイズの違いや解像度の違いに対応するようなUIをつくることができます。
シューティングゲーム中のUIの設定を見る限りすべて中央を基準点としているため、画面の大きさに対応できなくなってしまっています。
エディタ作業中のGameView上ではいい感じに出ていても、実際に作成されたゲームをフルスクリーン設定などで見てみるとだいぶ違ってしまっています。
問題に拍車を掛けたCanvasScalerの設定
さらに問題だったのがCanvasScalerのUIScaleModeの設定です。
UIScaleModeの設定がConstantPhysicalSizeになっていたため、UIのサイズが画面サイズの違いに影響せず、大きさが一切変わらないモードになっていました。
ちなみに、アンカーポジションの設定が甘くてもUIScaleModeの設定がScaleWithScreenSizeならば画面サイズによってUIの大きさが変化するため、誤魔化しは効きます。
下記はアンカーポジションの設定をし直したものです。
いい感じになりましたね。
敵に攻撃が当たりにくい
やけに攻撃用の弾が当たらないんですよね。
これはPrefabの中身を見たらすぐに原因がわかりました。
スプライトの画像に比べてコリジョン小さい!
首辺りしかコリジョンがない!
今回プレイヤーの自機に当たるコリジョンと弾のコリジョンの敵側の判定は共通のものになっていたので、プレイヤーに当たりにくい分、プレイヤーの攻撃も当たりにくいという泥仕合ハートフルなものになってしまっていました。
プレイヤーが敵に当たらない
プレイヤーの攻撃は当たりにくいとはいえ当たります。
プレイヤーと敵はまったく当たらないため、これは不平等ですよね。
この手の衝突しない問題は、質問サイトの定番中の定番です。
気をつけねばならない点は以下の通りです。
- 敵とプレイヤーのGameObjectにCollide2Dはアタッチされているか
- 敵とプレイヤーのGameObjectのどちらかにRigidbody2Dはアタッチされているか
- Triggerで取得したい場合は、IsTriggerがOnになっているか
- IsKinematicはOffになっているか
- OnTriggerEnter2D()を記述したコンポーネントがColiderと同じGameObjectにアタッチされているか
- OnTriggerEnter2D()の引数の型は正しいか。
ちなみに今回は、3と4が原因でしたー。
今みたいに締め切りのない心穏やかな状態ならば冷静に対処できるのですが、テンパってるときはなかなか原因がつかめないものです。
この過ちは次回に活かしたいと思います。