ブロック崩しを作ってみて得た7知見

どうも、Cacaponです😄

先日から3日ほど時間をかけて、ブロック崩しをUnityで作りました✨

ゲーム自体はunityroomでPCから遊ぶことができますので、良かったらぜひ😆

unityroom.com


前置きはさておき、このゲームを作ってみて今まで使ってなかったことや、

改めて知った事、改善していきたい事など色々と思うことがありました。


今回のブログでは、cacaponが作っていて出てきた問題やその解決法を知見として残そうと思います。

それが、誰かの役に立つのなら幸いです😄

知見① ボールの挙動について

まず最初に、ボールの挙動をどうするかを考えました。


参考までにUnityのブロック崩しを紹介しているサイトさんのサンプルを見ると、

物理挙動に任せっきりのものがほとんどで、下手すると45度固定のものも💦


それだとつまらないなぁと思ったCacaponは、

パドルが当たった位置で

反射する角度を変えることにしました。


具体的には下図のような感じに😄

f:id:cacapon:20211014130408p:plain

ボールの挙動自体も物理演算を使うのではなく、

Rigidbody.MovePosition で毎フレームごとに瞬間的に移動する形を採用しました。


まあ、これに関してはたまに枠外に飛び出たり、

トリガーの設定などが煩雑になったりともっといいやり方はありそうだったのですが💦

これでブロック崩しらしい動きを実現することが出来ました✨

知見② ブロックの当たる向きを判定する。

ブロック崩しと言えば、下のような挙動が標準的かと思います😄

f:id:cacapon:20211014131446p:plain

ブロックに当たる向きとボール飛んでくる向きで、反射を変えるといった感じですね。


今回cacapon作のブロック崩しは、ボール自体に飛ぶ方向を持たせており、

静的関数で水平方向、垂直方向に向きを反転させる関数も用意していたので、

向きを変える事自体は簡単でした😆*1


ただ、問題はブロックがどの向きから当たったのか判定すること😫

これが、今回調べるまではよくわかっていませんでした💦


結果的には、Unity自体に衝突時に法線ベクトルを取得する関数があったので、

それで向きを取得することができたのですが、

正直Unity任せでこのあたりの理解はまだ追いついてません💦


内容としては、数学の内積あたりになるようですので

暇を見て数学の知識も深めていかなければと思いました💦

知見③ プレイヤーのパドルのすり抜け対策

完全な物理挙動なら、壁にぶつかったら止まるはずなのですが、

パドルもMovePositionで動かしてたせいで、すり抜けてしまうのですね💦


f:id:cacapon:20211014132338g:plain

そのあたりを解決するのに苦慮しました💦


最終的に行ったのは、パドルの両端に、bool値*2を持たせ

両端が壁に当たっている場合は、それ以上先に動く処理を実行させない

ということにしました。

知見④ 初パーティクルシステム

プレイヤーがやられたときに爆発させたいなぁ

と、探してたところ

Unityの公式無料アセットで爆発のアセットがあったのでそれを利用しました✨

assetstore.unity.com

普段はパーティクルは使わないのですが、

演出を作るうえではこういったものを利用するのは中々面白そうだなぁ

と思ったCacaponなのでした

知見⑤ WebGLのアウトプットの形式が変わった時の対処法

いざ、完成となった時に困ったことが発生しました💦

いつもは問題なく、アウトプットされるWebGLのビルドデータが

形式が変わってしまったのです😫


詳しく見ると、wasmというのがasmというのに変わっていました。


原因はよくわかっていないのですが、

何かインポートをしたときに、変わってしまったという人が居たので、

いつもと違うのはパーティクルシステムを持ってきたことかな…?🙄


まあ、原因は分からず💦 

解決法だけは分かったのでそれで対処しました😅


それで、肝心の解決法ですが

出力されるデータの形式がasmになっている場合は、

ProjectSettings.assetの中の要素、

webGLLinkerTargetが 0 になっている可能性があります。


こちらを1に変えるとwasmに戻るので、参考までに😄


因みに最新のUniryだとUnityEditerからは変えることが出来ないそうなので、

vscodeなどのテキストエディタから変えるようにしてください😅

知見⑥ 破棄するオブジェクトの効果音が鳴らない!そんな時の対処法

私が効果音を付ける時、AudioSource.PlayOneShot()を使っています。

ただ、これだとブロックが壊れた時の音のように

オブジェクトが破棄されるタイミングの音を鳴らすことが出来ません。


そんな時に使うのが、PlayClipAtPoint

これは、効果音を鳴らしたいポイントに音の鳴らすオブジェクトを

なっている間だけ作るという機能みたいです😄

f:id:cacapon:20211014165210g:plain

こちらの図はブロックを連続破壊している時の

ヒエラルキーを録画したものなのですが、

‘one shot audio‘というものが作られているのが分かるでしょうか?

これが、指定した位置に指定した音を鳴らすという働きを持っているようなのです。

これをリスナーであるカメラのポジションを設定すると以下のような指定になります。

AudioSource.PlayClipAtPoint(SE, Camera.main.transform.position);

最初ブロックの位置につけてたりしたのですが、全く聞こえませんでした💦

単純な効果音として使いたい場合は今見てるカメラのポジションを指定すると良いでしょう😄

知見⑦ 解決したこと発見したことをTwitterにメモする

今回まとめた知見は、Twitterに呟いた内容を元にまとめています。

そうすると、ブログを書く時の材料になるので、これはいいなと思いました😄

忘れないですし😃


あ、私のTwitterは基本的にUnityでゲーム開発をしていて

以下のような情報を発信しています😄

  • Unityで開発をしてて感じたこと
  • 問題と解決法
  • 土日で作ったゲームのリリース告知*3

そういう情報が欲しい方はフォローをお願いします~

twitter.com


というわけで、ブロック崩しを作って得た7知見についてでした😆

単純なゲームでも色々と考えることがあり、為になった3日間となりました。


冒頭でもお知らせしましたが、作ったゲームはunityroomで遊ぶことができます😆

PC専用なので、PCからブログに来た方はどんなもんかと遊んでみてくださいな✨

unityroom.com

それではまた😄

*1:上下から当たった時は上下反転、左右から当たった時は左右反転にすると実現できます

*2:true,falseの二値になる変数

*3:最新のものは固定ツイートにしていますので良かったら遊んでみてください 今の所PC向けがほとんどです