プレイヤーが発射ボタンを押すと、Launcher ゲームオブジェクトは砲弾プレハブをインスタンス化します。プレハブにはメッシュ、リジッドボディ、コライダーが含まれているため、空中を飛んで衝突を検知することができます。
砲弾が何かと衝突すると、爆発プレハブをインスタンス化します。爆発プレハブにはパーティクルシステムエフェクトと、周囲のゲームオブジェクトに力を加えるスクリプトが含まれています。
Block の例 と同じように、砲弾プレハブがどんなに複雑であっても、砲弾を 1 行のコードでインスタンス化できます。プレハブをインスタンス化した後、インスタンス化されたゲームオブジェクトのプロパティを変更することもできます。例えば、砲弾のリジッドボディの速度を設定できます。
操作が簡単なだけでなく、コードに手を加えることなくプレハブを後で変更することもできます。例えば、砲弾がロケットだった場合、後でパーティクルシステムを追加して雲状の軌跡を残すようにできます。これを行うと、インスタンス化したすべてのロケットにパーティクルの軌跡が追加されます。
次のスクリプトは Instantiate メソッドを使用して砲弾を発射する方法を示しています。
using UnityEngine;
public class FireProjectile : MonoBehaviour
{
public Rigidbody projectile;
public float speed = 4;
void Update()
{
if (Input.GetButtonDown("Fire1"))
{
Rigidbody p = Instantiate(projectile, transform.position, transform.rotation);
p.velocity = transform.forward * speed;
}
}
}
このコードのプレハブ変数の型は Rigidbody であり、GameObject ではありません。これには 2 つの便利な効果があります。
この変数に割り当てることができるのは、Rigidbody コンポーネントを持つゲームオブジェクトだけです。これは、正しいゲームオブジェクトを変数に割り当てるのに役立ちます。
Instantiate メソッドは、新しいインスタンスの Rigidbody コンポーネントへの参照を返します。これは、インスタンス化した直後にリジッドボディの速度を簡単に設定できるので便利です。
public のプレハブ変数を作成する場合、変数の型は GameObject にすることも、任意の有効なコンポーネント型 (Unity ビルトインコンポーネントか、独自の MonoBehaviour スクリプトの 1 つ) にすることもできます。
GameObject 型の変数の場合、任意のゲームオブジェクトを変数に割り当てることができ、Instantiate 関数は新しいゲームオブジェクトインスタンスへの参照を返します。
コンポーネント型の変数 (Rigidbody、Collider、Light など) の場合、そのコンポーネント型のゲームオブジェクトのみを変数に割り当てることができ、Instantiate 関数は新しいゲームオブジェクトインスタンスの特定のコンポーネントへの参照を返します。
以下のスクリプト (砲弾プレハブに設定) は、砲弾が何かと衝突したときに砲弾の現在位置で爆発をインスタンス化し、砲弾ゲームオブジェクトを削除するアクションを実行します。
using UnityEngine;
public class Projectile : MonoBehaviour
{
public GameObject explosion;
void OnCollisionEnter()
{
Instantiate(explosion,transform.position,transform.rotation);
Destroy(gameObject);
}
}
上の図の再生モードで実行されているスクリプトを見ると、インスタンス化されたゲームオブジェクトが Hierarchy に現れ、名前に (Clone) が加えられています。