プレハブを使用した構造体のビルド
Use prefabs to instantiate several copies of a block prefab to construct a wall.
読み終わるまでの所要時間 6 分最終更新 1ヶ月前
コードを使用すると、特定の設定で多くのプレハブのコピーをほとんど瞬時に作成できます。このように構造をコードで生成することを手続き型生成といいます。
ブロックインスタンスの壁の作成
このタスクでは、ブロックインスタンスの壁を作成する方法を示します。
スクリプトをゲームオブジェクトにアタッチします。
- MonoBehaviour スクリプトを作成し、という名前を付けます。
Wall - スクリプトの下にコードを貼り付けます。
Wall - スクリプトをシーンの空のゲームオブジェクトにアタッチします。
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); } } }}
結果インスペクターは 変数を とともにフィールドに表示します。値 は、この変数にはプレハブがまだ割り当てられていないことを意味します。
BlockNoneNone
プレハブがまだ割り当てられていない Block 変数
Block 変数へのプレハブの割り当て
上記のスクリプト例は、プレハブを Block 変数に割り当てるまで機能しません。簡単なブロックプレハブを作成するには、以下の手順を行います。
-
GameObject > 3D Object > Cube を選択します。
-
キューブを Hierarchy ウィンドウから Project ウィンドウの Assets フォルダーにドラッグします。こうすると、プレハブアセットが作成されます。
-
プレハブの名前をに変更します。
Block -
プレハブがアセットになったので、Hierarchy からキューブを安全に削除できます。
Block -
プレハブを作成したので、それを Block 変数に割り当てることができます。元のゲームオブジェクト (
Blockスクリプトがアタッチされているゲームオブジェクト) を選択します。次に、Wallプレハブを Project ウィンドウから Block 変数スロット (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); } }}

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