# 自動的にブロックを配置しよう～

お試しで手動でいくつかのブロックを配置したが、なかなか面倒な作業なので、自動的に配置しましょう。

## スクリプト

まず、手動で配置したブロックのすべてを消しましょう。その後、新しいスクリプト「BlockManager」を作成しましょう。このスクリプトは：

- 実行中にプレハブからブロックを生成する
- Inspectorで「行数」と「列数」を設定できるようにする
- BlockManager の位置から始め、連続にブロックを配置して行く

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/cojimage.png)

まずは、変数から始めましょう：

### スクリプトの変数

```c#
using UnityEngine;

// ブロックの配置を管理する
public class BlockManager : MonoBehaviour
{
    // ブロックのプレハブ
    [SerializeField] 
    private GameObject blockPrefab;

    // 行の数
    [SerializeField] 
    private int rows;

    // 列の数
    [SerializeField] 
    private int cols;
}
```

### 初期化 - `Start()`

ここで、実際の配置しまほう。始まる位置はシーン上で適切に設定し、１個目のブロックを生成しましょう

```c#
void Start()
{
    // 始まる位置は自分の位置にする
    Vector3 start = transform.position;
    
    // 1個目を配置
    GameObject copy = Instantiate(blockPrefab);
    copy.transform.position = start;
}
```

### 確認

ヒエラルキーで空のゲームオブジェクトを作成し、「BlockManager」スクリプトをアタッチしてください。なお、<span style="color: rgb(186, 55, 42);">**このゲームオブジェクトの位置は、ブロックが現れる位置になる**</span>こと確認してください～

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/GZDimage.png)

### 連続に配置：縦と横の「for文」

#### ２個目を配置

つぎ、２個目を配置してみましょう。Y軸（縦軸）の位置は同じが X軸（横軸）のずれはどれぐらいになるの？

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/Xuuimage.png)

よく考えれば、この距離がちょうど１ブロックの幅であることがわかる。この数値は、スプライトから取得できるので、`SpriteRenderer` を取得し、そのスプライトのサイズを取っておきましょう。`Start()` を編集して…

```c#
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軸を１ブロック幅をずれる
    // オフセット：すらず量のこと
    Vector2 offset = new Vector2(blockSize.x, 0);
    copy = Instantiate(blockPrefab);
    copy.transform.position = start + offset;
}
```

#### １行目を配置

１個ずつを配置するのが大変面倒な作業なので、繰り返す命令「for」を使い、連続に１行を配置しましょう。すらず量は

- １個目：ブロック幅 × 0
- ２個目：ブロック幅 × 1
- ３個目：ブロック幅 × 2
- …

`for`文の繰り返しに使う変数をうまく使えば、簡単に１行目を配置できる。もう一度 `Start()` を編集し、`for`で１行目を作ろう：

```c#
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」（列の数）の設定を忘れずに！

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/ndfimage.png)

#### ２行目からを配置

1行が完成したので、これを「行数」を繰り返せば、すべてのブロックを配置ができる。つまり、`for`文の中にさらに`for`文が必要（１行の処理×行数）

```c#
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」数値を設定し、確認してください：

![image.png](https://class.illogic.games/uploads/images/gallery/2026-04/scaled-1680-/NEkimage.png)