Visual Scriptingでランダム配置をやってみる
経緯
「Unity2021 3D/2Dゲーム開発実践入門 」のChapter-4をすすめている。
序盤のステージ作成とアイテムの初期配置までやったのだが、このアイテムの初期配置というのが面白くない。プレハブを自分でステージのドロップし、手動で位置決めするというものなのだ。
面白くないというか、めんどくさい。
何でちまちま手で配置しなくちゃならんのか。
そんなわけで、自動配置のプログラムを作ってみることにした。
オブジェクトの生成
まずは何も考えず、10個のオブジェクトを作成するVSを作成してみる。
するとこうなった。
同一座標にオブジェクトを作成したため、すでにあったオブジェクトが強○的に押し出され爆発現象を引き起こしたのだろう。
じゃあ配置座標をランダムにしたらどうなるか? うまくいく場合もあるが、すでにオブジェクトが存在した場合、やはり爆発現象を引き起こすことになるだろう。となると、配置しようとした場所にすでにオブジェクトがあるかどうかをチェックする必要がある。
Physics.CheckBox
Unityで重なり検知や衝突検知でググると、出てくるのがOnTriggerEnter
やOnCollisionEnter
といったイベント系だ。ゲーム中に判断したいのではなく、ゲームの前段階で判断したいのだからこれらは使えない。それでさらにぐぐってみたらPhysics.CheckBox
というものを見つけた。Physics.CheckBox
はある座標に仮定して置いた正方形にぶつかるオブジェクトがあるかをチェックする関数だ。これを使えばイベント系の関数を使わずに重なり検知を行うことができる。
上記のVSだと、最悪1個した配置されない可能性があるので、ひとつのオブジェクトに付き五回くらいチェックを行い、重なりがなかった場合は配置してループを抜けるようにしたほうがいいだろう。
ただし、置けるまでチェックを繰り返すことはやめた方がいい。最悪、無限ループに陥る。
最終形
最終的には以下のようになった。
時々スタート時点でこぼれ落ちてしまうオブジェクトもあるが、最初としては十分だろう。
今回は書籍にないコードだったのでVSの画像を載せてみた。
やはりこうやって脇道に逸れ、調べ考え形にしていくことは写経よりも得るものが大きいと感じる。写経であっても、VSという別の形に置き換えることもUnityを理解する大きな助けになっていると感じている。
まだ作りたいものを作れるというレベルではないが、ガンバってプレイしてもらえるものを発表したいものである。