前回は Unity で指定されたプレハブからインスタンスを複製し、決められた位置に配置しました。
今回は、1 個ではなく 100 個のインスタンスを複製し、ランダムな位置に配置する処理を追加します。
※ Unity は 2021.3.14f1、 OS は Windows 10 です。
ループ処理で 100 個複製する
まずは for 文でループ処理を 100 回繰り返し、その中で Instantiate 関数を使ってプレハブからインスタンスを作成します。
void Start() { Vector3 pos = new Vector3(); for (int i = 0; i < 100; i++) { // 出現場所(固定)を設定します。 pos.x = 5f; pos.y = 5f; pos.z = 0f; // Prefab のインスタンスを作成します。 Instantiate(Prefab, pos, Quaternion.identity); } }
同じ位置に重なっているためテストプレイ中の Game ウィンドウでは1枚にしか見えませんが、 Hierarchy ウィンドウにはたくさんのゲームオブジェクトが作成されています。
出現範囲を指定する
ランダムといってもカメラの画角にきちんと表示されるようにしたいものです。
そこで出現範囲を Rect により指定できるようにします。
以前に Prefab を指定したときのように public 指定で Manager クラスの Rect メンバ変数を用意します。
/// 花びらの出現を許可する領域を設定します。 public Rect RespawnArea;
これで出現範囲を Unity エディタから指定できるようになりました。初期状態ではシーンのマスは1mなので、縦は画角より上の 10 m の範囲で 5 ~ 15 m、横は -9 ~ +9 mとします。
Rect に置き換えると X = -9, Y = 9, W = 18, H = 3 です。
※ Unity の Rect は水平方向は + 側が右、垂直方向は + 側が下になります。詳しくは「UnityEngine.Rect – Unity スクリプトリファレンス」を参照してください。
今回はシーンのマスの個数からサイズを計算しましたが、シーン上に Rect の範囲を表す四角形を表示したり、それを直接編集して出現範囲の Rect を直感的に編集できるように次回以降死体と思います。
出現範囲内で乱数を発生させる
指定された範囲からランダムな値を得るには、Random.Range 関数を使います。
Range(0f, 10f) の場合 0 ~ 10 の範囲でランダムな値を一つ返します。
それを配置位置 pos の X, Y にそれぞれ設定します。
今回、乱数で得るのは基準の X, Y からの距離です。
この距離は 0 ~ RespawnArea.width, height です。
width は横幅、height は縦幅を表します。
void Start() { Vector3 pos = new Vector3(); for (int i = 0; i < 100; i++) { // 出現場所(固定)を設定します。 pos.x = RespawnArea.x + Random.Range(0f, RespawnArea.width); pos.y = RespawnArea.y + Random.Range(0f, RespawnArea.height); pos.z = 0f; // Prefab のインスタンスを作成します。 Instantiate(Prefab, pos, Quaternion.identity); } }
これにより 100 個の「桜の花びら」ゲームオブジェクトが出現範囲内でランダムに作成・配置され、舞い降りてきました。
まだ、花びらが同じ動きをしたりするので、今後も改善していきたいと思います。
コメント