Edited at

Unity でブロック崩しを作る際にハマりがちな難所

More than 1 year has passed since last update.

この記事では、Unity でブロック崩しを作る際にハマりがちな難所について紹介します。

itemstore BLOG で連載している

いますぐ始めるアプリ内課金

の補足になりますので、併せてお読みください。

なお、このブロック崩しは、 Android 4.2 以降のスマホで実際にプレイできます。

GooglePlay


ハマりがちな難所


ボールが水平に移動してしまう

Unity の物理エンジンはとても便利で、ボールの反射も基本的に Rigidbody2D の物理演算で楽に実装しています。

しかし、テストプレイ中困ったことがありました。

ごくまれにですが、壁の角にぶつかったあと水平にボールが動き出してしまったのです。

これでは、バーで打ち返すこともできず、ゲームが進行しません。

そこで、常に移動方向の角度を確認して、水平に近かったら補正するように処理を追加しました。

今回はボールの加速度 Rigidbody2D.velocity から単位ベクトルを得て、x, y 成分ごとに一定の範囲に寄せるように調節しました。


Ball.cs

    private void FixedUpdate()

{
//...

// 移動する方向のベクトルを正規化します。
Vector2 velocityNormalized = rb.velocity.normalized;

//...

// 何もしないと角にぶつかったときに水平に移動を始める場合があります。
// それではゲームに支障をきたすので、移動する方向が一定範囲の角度の場合は、許可される範囲に丸めます。
float limitVerticalDeg = 10f; // 垂直方向は 90 ± 10 度、270 ± 10 度の範囲の角度は近いほうに寄せる。
float limitHorizontalDeg = 45f; // 水平方向は 0 ± 45 度、 180 ± 45 度の範囲の角度は近いほうに寄せる。
if (velocityNormalized.x >= 0f)
{
velocityNormalized.x = Mathf.Clamp(velocityNormalized.x, Mathf.Cos(Mathf.Deg2Rad * (90 - limitVerticalDeg)), Mathf.Cos(Mathf.Deg2Rad * (0 + limitHorizontalDeg)));
}
else
{
velocityNormalized.x = Mathf.Clamp(velocityNormalized.x, Mathf.Cos(Mathf.Deg2Rad * (180 - limitHorizontalDeg)), Mathf.Cos(Mathf.Deg2Rad * (90 + limitVerticalDeg)));
}
if (velocityNormalized.y >= 0f)
{
velocityNormalized.y = Mathf.Clamp(velocityNormalized.y, Mathf.Sin(Mathf.Deg2Rad * (180 - limitHorizontalDeg)), Mathf.Sin(Mathf.Deg2Rad * (90 + limitVerticalDeg)));
}
else
{
velocityNormalized.y = Mathf.Clamp(velocityNormalized.y, Mathf.Sin(Mathf.Deg2Rad * (270 - limitVerticalDeg)), Mathf.Sin(Mathf.Deg2Rad * (180 + limitHorizontalDeg)));
}

//...
}


もっと簡単に、角度の範囲で場合わけして処理したほうがシンプルで良かったかもしれません。


さまざまな画面解像度への対応

スマートフォンにはさまざまな解像度があります。

GUI はアンカーを設定することで、さまざまな解像度にあわせられますが、スプライトはうまく対応できませんでした。

そこで、次のサイトで紹介されているカメラの調節機能を Camera コンポーネントに追加しました。

参照:Unity2Dで画面のアスペクト比を固定にしたい【Unity】 - Qiita

これにより、次のように画面解像度などを設定すると、アスペクト比を保ちつつ適度にズームしてスマートフォンの画面にあわせて表示してくれます。

Unity は利用者が多く、有用なアセットや情報を公開している方も多いので、困ったときは検索してみましょう。


Android のビルドが失敗する

Unity エディタ上でうまく動作して、安心していても、ビルドがうまくいかないということは意外とあるかもしれません。

今回は、 Unity 2017.2.0f3 の Android ビルドで実際に起こったビルドエラーを例として紹介し、その対策方法を説明します。

ビルドの終盤で次のようなエラーが発生しました。

[Failed to sign APK package]

と書いてあります。

このエラーメッセージで検索すると、[Build Type] を [Internal(Default)] から [Gradle(New)] に変えてビルドすると解決すると書いてあったので、そのようにすると無事にビルドができました。

参照:Failed to sign APK package (Unity 2017) - Unity Answers

Unity は多くの情報がウェブに公開されているので、何か困ったら、 Console やダイアログに表示されるメッセージで検索してみると良いでしょう。


参考リンク