ドキュメント

Unity Engine

Unity Engine

プレハブを使用した構造体のビルド

Use prefabs to instantiate several copies of a block prefab to construct a wall.
読み終わるまでの所要時間 6 分最終更新 1ヶ月前

コードを使用すると、特定の設定で多くのプレハブのコピーをほとんど瞬時に作成できます。このように構造をコードで生成することを手続き型生成といいます。

ブロックインスタンスの壁の作成

このタスクでは、ブロックインスタンスの壁を作成する方法を示します。

スクリプトをゲームオブジェクトにアタッチします。

  1. MonoBehaviour スクリプトを作成し、
    Wall
    という名前を付けます。
  2. Wall
    スクリプトの下にコードを貼り付けます。
  3. Wall
    スクリプトをシーンの空のゲームオブジェクトにアタッチします。
using UnityEngine;public class Wall : MonoBehaviour{ public GameObject block; public int width = 10; public int height = 4; void Start() { for (int y=0; y<height; ++y) { for (int x=0; x<width; ++x) { Instantiate(block, new Vector3(x,y,0), Quaternion.identity); } } }}
結果インスペクターは
Block
変数を
None
とともにフィールドに表示します。値
None
は、この変数にはプレハブがまだ割り当てられていないことを意味します。

プレハブがまだ割り当てられていない Block 変数

Block 変数へのプレハブの割り当て

上記のスクリプト例は、プレハブを Block 変数に割り当てるまで機能しません。簡単なブロックプレハブを作成するには、以下の手順を行います。
  1. GameObject > 3D Object > Cube を選択します。
  2. キューブを Hierarchy ウィンドウから Project ウィンドウの Assets フォルダーにドラッグします。こうすると、プレハブアセットが作成されます。
  3. プレハブの名前を
    Block
    に変更します。
  4. Block
    プレハブがアセットになったので、Hierarchy からキューブを安全に削除できます。
  5. Block
    プレハブを作成したので、それを Block 変数に割り当てることができます。元のゲームオブジェクト (
    Wall
    スクリプトがアタッチされているゲームオブジェクト) を選択します。次に、
    Block
    プレハブを Project ウィンドウから Block 変数スロット (
    None
    と表示) にドラッグします。

Block プレハブが割り当てられた Block 変数

この設定が完了したら、Play をクリックすると、プレハブを使用した Unity ビルドが表示されます。

上記の例で生成された、10 ブロック 4 列でビルドされた壁。

これは、Unity で何度も使用できる柔軟なワークフローパターンです。このスクリプトではプレハブを使用しているため、プレハブを簡単に置き換えたり編集したりして、スクリプトを変えることなく壁のレンガのプロパティを変更することができます。また、異なるプレハブが割り当てられたシーン内の他のゲームオブジェクトに
Wall
スクリプトを使用して、さまざまなタイプのプレハブで作られたさまざまな壁を作成することもできます。
コードを使用すると、作成するゲームやアプリケーションに合わせて、ゲームオブジェクトをグリッド、円状、ランダムに散らばったもの、その他の考えうる配置に置くことがます。インスタンスを円状に配置する別の例を次に示します。
using UnityEngine;public class CircleFormation : MonoBehaviour{ // Instantiates prefabs in a circle formation public GameObject prefab; public int numberOfObjects = 20; public float radius = 5f; void Start() { for (int i = 0; i < numberOfObjects; i++) { float angle = i * Mathf.PI * 2 / numberOfObjects; float x = Mathf.Cos(angle) * radius; float z = Mathf.Sin(angle) * radius; Vector3 pos = transform.position + new Vector3(x, 0, z); float angleDegrees = -angle*Mathf.Rad2Deg; Quaternion rot = Quaternion.Euler(0, angleDegrees, 0); Instantiate(prefab, pos, rot); } }}

上記の例で生成されたブロックの円状配置

追加リソース