制作中の落ちゲーにて落下してくるボールの数を増やす事から始めます。
このままだとボールは僅か1個しか降ってこないのでゲーム性に欠けますからね!
Prefabを使ってボールを量産する
Prefabは作成したオブジェクトを量産するために使います。今回の場合はボールオブジェクトが対象になります。
同じようなものをたくさん作りたい場合は、Prefabを使うと良いですよ。特にゲームを作成する場合は非常に使う機会が多いです。アイテム系のPrefabとかね。
Prefabとコピーの違いについて
量産するだけなら、普通にコピペすればいいじゃんって思いませんか?
しかし、Prefabを使う事とコピーする事には違いがあるんです。
例えば、赤いボールのインスタンスを5個作ったとします。ある時にボールの色を赤から青に色を変えたいと思った場合、コピーしていたインスタンスでは1個ずつ変更しないといけません。
しかし、Prefabを使っていた場合は、Prefabの色を変えるだけで5個全てに適応されます。
何かしら変更がある場合に、Prefabだけ変えれば良いので余計な手間が省けるってわけです。
Prefabを作成する
というわけで、早速作成していきます。
作り方は簡単で、対象にしたいオブジェクトをプロジェクトウィンドウにドラッグ&ドロップするだけです。
こんな感じですね。ちゃんと移動していたらひし形アイコンが表示されます。
これがプレハブになるので分かりやすい名前に変更しておきます。
スクリプトを作成する
では、ボールを量産するためのスクリプトを作成します。
新しいC#スクリプトを作成し、そこに記述していきます。
後ほど動作確認しますが、とりあえず形としてはこんな感じです。
まずは、7行目でボールのPrefabを変数として宣言します。
20行目以降で1秒おきにボールを1個生成します。Updateメソッドに記述することでフレーム毎に実行されるので前のフレームと今のフレームの時間差を察知することが出来ます。
フレームの時間差はTime.deltaTimeに代入されます。時間差はdelta変数に蓄積されていくので、1秒経過したところで中身を空にします。
そして、ボールを生成することで1秒おきにボールを作成することが出来る訳です。
ボールのインスタンスはInstantiateメソッドを使って生成します。
引数にボールのプレハブを渡すことで、Prefabインスタンスを返します。GameObject型を受け取りたいので「as GameObject」でキャストします。
ボールがどこから落ちてくるかですが、ランダムな位置で落ちてきたほうが面白いのでxの座標を「-5」から「5」の間にしてみます。後でゲームを動かしてみてバランス悪そうだったらこの範囲を変更することにします。
ちなみに、Random.Rangeでint型を指定した場合は、max値を含まないので注意が必要です。
Random.Range(5,5)としてしまうと5を含まないので第二引数は6を指定しています。
空のオブジェクトを作成してスクリプトをアタッチする
作成したスクリプトを空のオブジェクトにアタッチします。
ヒエラルキーウィンドウで「Create」→「Create Empty」を選択して空のオブジェクトを作ります。
先ほど作ったスクリプトを今作ったオブジェクトにドラッグ&ドロップします。
元々単体で用意していたボールのオブジェクトは削除してもOK。
スクリプトにPrefabを渡す
スクリプト中にあるPrefab変数と実体を紐づけしなければなりません。
プレハブの実態を変数に代入するイメージですね。
まずは、ヒエラルキーウィンドウから先ほど作成したオブジェクトを選択して、プレハブの変数の設定を行います。
インスペクタータブのスクリプトの下の方に変数を設定できる項目があります。画像のようにプレハブをドラッグ&ドロップします。
これで、ボールのプレハブ変数に実体を代入したことになります。
ゲームを実行して動作確認をする
ここまで出来たら、ちゃんとランダムにボールが降ってくるのか確認します。
こんな感じで1秒ごとにボールが降ってくればOKです。
両端ギリギリの場所からボールが降ってこないので、Random.Range関数で取得する範囲をもう少し広げると良さそうでした。
それから、ボールの落下スピードがそこまで速いわけではないので、ボールの生成速度を1秒間隔からもっと短くするのもありですね。
Random.Range関数の中身をfloat型にして、ありとあらゆる場所から降らせる事も出来ますかね。
ゲームの完成が近づくにつれて、難易度調整のバリエーションが増えてきました。
次回は体力ゲージを設定していきます。