在此示例中,当玩家按下射击按钮时,一个 Launcher 游戏对象会实例化一个飞弹预制体。预制件包含一个网格、一个刚体和一个碰撞器,因此它可以在空中飞行并检测碰撞事件。
当飞弹与某个物体碰撞时,它会实例化一个爆炸预制体。爆炸预制件包含粒子系统和一个脚本,该脚本会对周围的其他游戏对象施加力的效果。
与前面的 Block 示例类似,无论飞弹预制体的复杂程度如何,都可以通过一行代码完成实例化。在实例化预制体后,还可以修改实例化后的游戏对象的任何属性。例如,可以设置飞弹刚体的速度。
这种方式不仅易于使用,还可以在不修改代码的情况下随时调整预制体。例如,如果飞弹是一枚火箭,后续可以为其添加一个粒子系统,使其留下尾迹。完成此操作后,所有实例化的火箭都会带有粒子轨迹。
以下脚本展示了如何使用 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;
}
}
}
在代码中,预制件变量类型是刚体,而不是游戏对象。这种做法有两个优点:
只能将具有刚体组件的游戏对象分配给此变量。此功能很有用,其有助于确保分配给变量的是正确的游戏对象。
Instantiate 方法返回新实例上刚体组件的引用。此功能很有用,其使得在实例化后可以立即设置刚体的速度。
在创建公共预制体变量时,变量类型可以是游戏对象,也可以是任何有效的组件类型(Unity 内置组件或自定义的 MonoBehaviour 脚本)。
对于游戏对象类型的变量,可以分配任意游戏对象,而 Instantiate 函数会返回新游戏对象实例的引用。
对于组件类型变量(例如刚体、碰撞体和光源),只能分配带有该组件的游戏对象,而 Instantiate 函数会返回新游戏对象实例上对应组件的引用。
以下脚本(放置在飞弹预制体上)会在飞弹碰撞物体后,在飞弹的当前位置实例化爆炸,并销毁飞弹游戏对象。
using UnityEngine;
public class Projectile : MonoBehaviour
{
public GameObject explosion;
void OnCollisionEnter()
{
Instantiate(explosion,transform.position,transform.rotation);
Destroy(gameObject);
}
}
在上图中,运行模式下的脚本显示,实例化后的游戏对象会出现在层级视图中,并在名称后附加 (Clone) 字样。