今回は障害物となるブロックをランダムで生成していきましょう。
まずロジック(アルゴリズム)を考えましょう。
- 乱数を生成しその数のブロックが複製される
- 位置が画面ギリギリのY軸を基準に調整される
- 複製されたオブジェクトは空のゲームオブジェクトの子オブジェクトになる
- 3の親オブジェクトがずっと左に移動する。
こんな感じで実装してみましょう。
①左に移動し続ける空のオブジェクトを作成する。
AllTransという名前で空のオブジェクトを作成しました。現在のヒエラルキーは以下の通りです。
②Blockを複製できるようPrehub化する。
Blockを複製して取り扱いやすいようにPrehub化しましょう。
シーンにあるBlockをしたのAssetのところにドラック&ドロップします。画像とかC#スクリプトとかがあるところですね。
こんなのができました。
③ゴリゴリ、スクリプトを書く
以下のスクリプトをAllTransにアタッチしてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
using System.Collections; using System.Collections.Generic; using UnityEngine; public class BlockCreater : MonoBehaviour { //BlockCreater.cs public GameObject block; public GameObject AllTrans; public float Allspeed; //ブロックが右に流れていくスピード public float timeOut; //何秒ごとにブロックがくるか private float timeElapsed; private int BlockValueOver; private int BlockValueUnder; public float BlockBaseY;//画面端にくるブロックのY座標 4.5ぐらい public float BlockBaseX;//画面端にくるブロックのX座標 10ぐらい 大きければ遠くからくるから最初の波がくるのが遅くなる。 // Use this for initialization void Start () { } // Update is called once per frame void Update () { AllTrans.transform.position += new Vector3(-Allspeed, 0, 0); timeElapsed += Time.deltaTime; if (timeElapsed >= timeOut) { BlockValueOver = Random.Range(1, 5); for (int i = 0; i <= BlockValueOver; i++) { GameObject Blockclone = GameObject.Instantiate(block) as GameObject; //複製 Blockclone.transform.parent = AllTrans.transform; //BlockcloneをAllTransの子オブジェクトに Blockclone.transform.position = new Vector3(BlockBaseX, i - BlockBaseY, 0); //位置を調整 } BlockValueUnder = Random.Range(1, 2); for (int j = 0; j <= BlockValueUnder; j++) { GameObject Blockclone = GameObject.Instantiate(block) as GameObject; Blockclone.transform.parent = AllTrans.transform; Blockclone.transform.position = new Vector3(BlockBaseX, -j + BlockBaseY, 0); } timeElapsed = 0.0f; } } } |
インスペクターで値をとりあえず以下のようにしてみてください。
- Block:Prehub化されたBlock(※シーンにあるものではない)
- AllTrans:親となる空のゲームオブジェクト
- Allspeed:ブロックが左に向かってくるスピード
- TimeOut: ブロックが来る頻度
- Block Base X : 画面の右の外側となるX (10ぐらい)
- Block Base Y : 画面の端となるY(4.5ぐらい)
以下のようになりましたか。
しかしこれでは鳥がブロック当たっても何も起きません。
次回はコライダーを設定し当たり判定をつけていきましょう。