0
0

More than 1 year has passed since last update.

【テトリス作成②】ブロックスポーン生成について深掘る

Last updated at Posted at 2022-11-14

こちらを元に解説しています。
https://qiita.com/hanatan079/items/3675855784e14acda119

★★★★★随時更新★★★★★
2022.11.22追記
20022.11.28追記
★★★★★★★★★★★★★★★

(見本)Spawner.cs

    //生成するブロックすべて格納(配列)
       [SerializeField]
       Block[] Blocks;

    //ランダムなブロックを1つ選ぶ
    Block GetRandomBlock()
    {
        int i = Random.Range(0, Blocks.Length);
        if(Blocks[i])
        {
            return Blocks[i];
        }
        else
        {
            return null;
        }
    }

    //選ばれたブロックを生成
    public Block SpawnBlock()
    {
        Block block = Instantiate(GetRandomBlock(), transform.position, Quaternion.identity);
        if(block)
        {
            return block;
        }
        else
        {
            return null;
        }
    }
(見本)GameManeger.cs

//スポナー
Spawner spawner;
//生成されたブロック格納
Block activeBlock;

//スポナーオブジェクトをスポナー変数に格納するコード
    private void Start()
    {
       ② spawner =③GameObject.④FindObjectOfType⑤<Spawner>();

//スポナークラスからブロック生成関数をよんで変数に格納する
        ①if (!activeBlock)
        {
            ②activeBlock = spawner.SpawnBlock();
        }
    }

解説

(配列)
    //生成するブロックすべて格納
       ①[SerializeField]
      ②Block[] ③Blocks;

①インスペクタから設定できるように
②ブロック型の配列(作成した7つのブロックを全て格納する用)
BlockをBlocksという名前にする
変数名Blocks
変数について
https://qiita.com/hanatan079/items/8d93186d25d460bd378e

Hierarchie > spawner のインスペクタにBlock[]が表示され、そこへプレファブのブロック(7こ)を格納する。

(関数)
    //配列に格納されたブロックからランダムに1つ選ぶ
    ①Block ②GetRandomBlock()
    {
     int i = ③Random.Range(0,④Blocks.Length);
       ⑤ if(Blocks[i])
        {
           ⑥ return Blocks[i];
        }
        ⑦ else
        {
          ⑧ return null;
        }
    }

①Block関数、Block型の値を呼ばれた場所に返す
②GetRandomBlock名前
引数を2つ設定することで2つの中からランダムに選ぶ
最小値0〜最大値Blocks.Length(④)の中からランダムに選ぶ
④配列に格納した要素数   
 (配列には7つのブロックが格納されている=0~7未満が返ってくる)
⑤配列の中にはi(0~7未満)の配列(ブロック)はあるのか
⑥あるのであればi番目のブロックを返す
⑦ブロックが無いのであれば
⑧null=空を返す

型について
https://qiita.com/hanatan079/items/36386ae4335bb0b06c88
if文について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f

(関数)
    //選ばれたブロックを生成し変数を格納する
    ①public ②Block SpawnBlock()
    {
       ③ Block block = ④Instantiate(GetRandomBlock(), transform.position, Quaternion.identity);
        ⑤if(block)
        {
           return block;
        }
        else
        {
           return null;
        }
    }

①他から呼び出し
ブロック型、選ばれたブロックの名前をSpawnBlockとする
ブロック関数、変数SpawnBlock
③Block関数、変数blockへ
④GetRandomBlockプレファブを生成して③へ格納する
⑤ block変数があるのか
   あるのであればブロックを返し無いのであれば空を返す
ランダムにブロックが選ばれたらそのブロックを渡し、無いのであれば空を渡す

Instantiate関数について
https://qiita.com/hanatan079/items/66a183ea5168c985c366
if文について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f

(GameManeger.cs)
(配列)
//スポナー
①Spawner spawner;

//生成されたブロック格納
②Block activeBlock;

①スポナー型、変数
②ブロック型、変数

変数について
https://qiita.com/hanatan079/items/8d93186d25d460bd378e

//Spawnerオブジェクトをspawner変数に格納するコード
    private void Start()
    {
       ①spawner =GameObject.FindObjectOfType<Spawner>();

//スポナークラスからブロック生成関数をよんで変数に格納する
        ②if (!activeBlock)
        {
            ③activeBlock = spawner.SpawnBlock();
        }
    }

①全てのオブジェクトからSpawnerコンポーネントを探してspawner変数へ格納する
FindObjectOfTypeは全てのコンポーネントの中から<>を探すため重い処理。乱用注意。

②本来は生成されたブロックが格納されていればtrue
   (!)生成されたブロックが格納されていなければ(空だったら)true
③生成されていなかったら、Spawner spawne(スポナー)をactiveBlock(生成されたブロック)へ格納する

if文、!否定について
https://qiita.com/hanatan079/items/01530bc45bab85f3d19f
FindObjectOfTypeについて
https://qiita.com/hanatan079/items/9b0c62cb3beeb9b4fdd1

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0