预制体与实例化
本课属于 Coddy Unity 学习旅程的“Unity 脚本基础”单元。第 62 课,共 85 课。
预制体是保存为模板的 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) 的对象。预制体保持原样,因此每个副本都从相同的值开始。这里 GetKeyDown 很重要:如果使用 GetKey,按住 Space 半秒就会投放大约 30 个包裹,每帧一个。
挑战
中等每次点击时,都在玩家上方生成一枚硬币。
- 添加字段
public GameObject coinPrefab;。场景会将 Coin 预制体赋给它。 - 在
Update()中,当Input.GetMouseButtonDown(0)时,调用Instantiate(coinPrefab, transform.position + new Vector3(0, 2, 0), Quaternion.identity);。
按“运行”,移动并点击:每次点击时,玩家上方都会出现一枚硬币。然后点击“检查”。
亲手试试
using UnityEngine;
public class CoinDropper : MonoBehaviour
{
public float speed = 4f;
// coinPrefab:一个公共 GameObject 字段,填入 Coin 预制体
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);
}
// 点击:在玩家上方 2 个单位处生成一枚硬币
}
}
Unity 脚本基础中的所有课
自己练习: Unity 在线编辑器