自動的にブロックを配置しよう~
お試しで手動でいくつかのブロックを配置したが、なかなか面倒な作業なので、自動的に配置しましょう。
スクリプト
まず、手動で配置したブロックのすべてを消しましょう。その後、新しいスクリプト「BlockManager」を作成しましょう。このスクリプトは:
- 実行中にプレハブからブロックを生成する
- Inspectorで「行数」と「列数」を設定できるようにする
- BlockManager の位置から始め、連続にブロックを配置して行く

まずは、変数から始めましょう:
スクリプトの変数
using UnityEngine;
// ブロックの配置を管理する
public class BlockManager : MonoBehaviour
{
// ブロックのプレハブ
[SerializeField]
private GameObject blockPrefab;
// 行の数
[SerializeField]
private int rows;
// 列の数
[SerializeField]
private int cols;
}
初期化 - Start()
ここで、実際の配置しまほう。始まる位置はシーン上で適切に設定し、1個目のブロックを生成しましょう
void Start()
{
// 始まる位置は自分の位置にする
Vector3 start = transform.position;
// 1個目を配置
GameObject copy = Instantiate(blockPrefab);
copy.transform.position = start;
}
確認
ヒエラルキーで空のゲームオブジェクトを作成し、「BlockManager」スクリプトをアタッチしてください。なお、このゲームオブジェクトの位置は、ブロックが現れる位置になること確認してください~

連続に配置:縦と横の「for文」
2個目を配置
つぎ、2個目を配置してみましょう。Y軸(縦軸)の位置は同じが X軸(横軸)のずれはどれぐらいになるの?

よく考えれば、この距離がちょうど1ブロックの幅であることがわかる。この数値は、スプライトから取得できるので、SpriteRenderer を取得し、そのスプライトのサイズを取っておきましょう。Start() を編集して…
void Start()
{
// プレハブのSpriteRendererを求める
SpriteRenderer spriteRenderer = blockPrefab.GetComponent<SpriteRenderer>();
// そこからspriteのサイズを取得
Vector2 blockSize = spriteRenderer.size;
// 始まる位置は自分の位置にする
Vector2 start = transform.position;
// 1個目を配置
GameObject copy = Instantiate(blockPrefab);
copy.transform.position = start;
// 2個目も配置. Y軸は同じで、X軸を1ブロック幅をずれる
// オフセット:すらず量のこと
Vector2 offset = new Vector2(blockSize.x, 0);
copy = Instantiate(blockPrefab);
copy.transform.position = start + offset;
}
1行目を配置
1個ずつを配置するのが大変面倒な作業なので、繰り返す命令「for」を使い、連続に1行を配置しましょう。すらず量は
- 1個目:ブロック幅 × 0
- 2個目:ブロック幅 × 1
- 3個目:ブロック幅 × 2
- …
for文の繰り返しに使う変数をうまく使えば、for文の繰り返しに使う変数をうまく使えば、簡単に1行目を配置できる。もう一度 Start() を編集し、forで1行目を作ろう:forで1行目を作ろう:
void Start()
{
// プレハブのSpriteRendererを求める
SpriteRenderer spriteRenderer = blockPrefab.GetComponent<SpriteRenderer>();
// そこからspriteのサイズを取得
Vector2 blockSize = spriteRenderer.size;
// 始まる位置は自分の位置にする
Vector2 start = transform.position;
// 1行目目を配置(列数のブロックを配置)
for (int i = 0; i < cols; i++)
{
// すらず量(ブロック幅 × i)
Vector2 offset = new Vector2(blockSize.x * i, 0);
// インスタンスを作成し、配置
GameObject copy = Instantiate(blockPrefab);
copy.transform.position = start + offset;
}
}
Inspectorで「cols」(列の数)の設定を忘れずに!

2行目からを配置
すべての1行が完成したので、これを「行数」を繰り返せば、すべてのブロックを配置ができる。つまり、for文の中にさらにfor文が必要(1行の処理×行数)
void Start()
{
// プレハブのSpriteRendererを求める
SpriteRenderer spriteRenderer = blockPrefab.GetComponent<SpriteRenderer>();
// そこからspriteのサイズを取得
Vector2 blockSize = spriteRenderer.size;
// 始まる位置は自分の位置にする
Vector2 start = transform.position;
// 各行を表示
for (int j = 0; j < rows; j++)
{
// 各列を表示
for (int i = 0; i < cols; i++)
{
// すらず量(ブロック幅 × i, ブロック高さ × j)
// y軸の場合は↓の方に進むので、「-」を付ける!
Vector2 offset = new Vector2(blockSize.x * i, -blockSize.y * j);
// インスタンスを作成し、配置
GameObject copy = Instantiate(blockPrefab);
copy.transform.position = start + offset;
}
}
}
Inspectorで「rows」数値を設定し、確認してください:
