プレハブとInstantiate
CoddyのUnityジャーニー「Unityスクリプティングの基礎」セクションの一部。レッスン 48/67。
プレハブとは、テンプレートとして保存されたGameObjectです。HierarchyからオブジェクトをProjectウィンドウにドラッグすると、UnityはそのすべてのコンポーネントとInspectorの値を一緒に保存します。プレハブ自体はシーン内にはありません。スクリプトでは、ほかの参照と同様にフィールドを通じて取得します。public GameObject parcelPrefab;と宣言し、Inspectorでプレハブをそのフィールドにドラッグします。
Instantiate(prefab, position, rotation)はシーン内にプレハブのコピーを作成し、それを返します。この配送ドローンは、Spaceキーを押すたびに自身の位置に荷物を落とします。Quaternion.identityは回転なしを意味します。
public GameObject parcelPrefab;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Instantiate(parcelPrefab, transform.position, Quaternion.identity);
}
}キーを押すたびに、HierarchyにParcel(Clone)という名前のオブジェクトがもう1つ追加されます。プレハブは元のままなので、コピーはすべて同じ値から始まります。ここではGetKeyDownが重要です。GetKeyを使うと、Spaceキーを0.5秒間押し続けた場合、フレームごとに1つずつ、約30個の荷物を落とすことになります。
チャレンジ
中級矢印キーでプレイヤーはすでに移動します。クリックするたびに、プレイヤーの上にコインを生成しましょう。
GameObject型のcoinPrefabという名前の public フィールドを追加します。フィールドができると、シーンによってCoinプレハブが自動的に設定されます。- マウスの左ボタンをクリックしたとき、プレイヤーの2単位上に、回転なしでコインを1つ生成します。
Playを押し、何度か移動してクリックしてから、Checkを押します。
自分で試してみよう
using UnityEngine;
public class CoinDropper : MonoBehaviour
{
public float speed = 4f;
// coinPrefab: Coin プレハブを設定する public な GameObject フィールド
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
transform.position += new Vector3(speed * Time.deltaTime, 0, 0);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
transform.position -= new Vector3(speed * Time.deltaTime, 0, 0);
}
// Click: プレイヤーの 2 ユニット上にコインを生成する
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。