自動的にブロックを配置しよう~
お試しで手動でいくつかのブロックを配置したが、なかなか面倒な作業なので、自動的に配置しましょう。
スクリプト
まず、手動で配置したブロックのすべてを消しましょう。その後、新しいスクリプト「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行を配置しましょう。すらず量は
for文の繰り返しに使う変数をうまく使えば、簡単に1行目を配置できる。もう一度 Start() を編集し、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」(列の数)の設定を忘れずに!

すべての