Skip to main content

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

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

スクリプト

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

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

image.pngimage.png

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

スクリプトの変数

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」スクリプトをアタッチしてください。なお、このゲームオブジェクトの位置は、ブロックが現れる位置になること確認してください~

image.png

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

2個目を配置

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

image.png

よく考えれば、この距離がちょうど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文の繰り返しに使う変数をうまく使えば、簡単に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」(列の数)の設定を忘れずに!

    image.png

    すべての