こちらを元に解説しています。
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