Unity学习90天 - 第4天 - 学习预制体 Prefab + 实例化并实现按鼠标生成子弹

Hey!欢迎回来! 今天我们来学习 Unity 的预制体 Prefab+ 实例化。 学完这个,我们就可以做一个简单的射击小游戏啦!

一、什么是预制体 Prefab?

Prefab(预制体) 是 Unity 中一种可重复使用的游戏对象模板。

类比 :Prefab 就像蛋糕模具------你做好一个模具,之后可以无限次用它做出一模一样的蛋糕(实例)。改模具,所有蛋糕跟着变;改单个蛋糕,不影响模具和其他蛋糕。

为什么要用 Prefab?

场景 不用 Prefab 用 Prefab
场景里有 100 个相同的敌人 手动复制 100 次,改一个要改 100 次 改 Prefab,100 个全变
运行时动态生成敌人 无法实现 Instantiate(prefab) 随时生成
多场景共用同一对象 每个场景单独做 一个 Prefab 拖进多个场景

二、Prefab 的制作

2.1 创建 Prefab

方法一:从 Hierarchy 创建(推荐)

1、 在 Hierarchy 中搭建好游戏对象(如一个 Cube + Rigidbody + 红色材质)

2、从 Hierarchy 拖到 Project 窗口的 Assets 文件夹

3、拖进去后,Hierarchy 中的对象名字变成蓝色 → 表示已关联 Prefab

方法二:直接创建空 Prefab

1、 Project 窗口右键 → Create → Prefab

2、 从 Hierarchy 拖对象到这个空 Prefab 上

建议把 Prefab 放在专门的 Prefabs 文件夹里,方便管理。

三、Prefab 的修改与同步

3.1 三种修改方式

修改方式 操作 影响范围
改 Prefab 资源 双击 Project 里的 Prefab 文件编辑 所有实例都变
改场景中的实例 在 Hierarchy 里选中实例修改 只改这一个,Prefab 不变
覆盖 Prefab(Apply) 实例改完后点 Apply 把实例的改动同步给 Prefab 和所有其他实例

3.2 Overrides(覆盖)窗口

在 Inspector 顶部,实例会有几个按钮:

按钮 作用
Open 打开 Prefab 编辑模式
Select 在 Project 窗口定位到 Prefab 文件
Overrides 查看这个实例改动了哪些属性

四、Instantiate------代码实例化

4.1 基础用法

cs 复制代码
using UnityEngine;

public class SpawnManager : MonoBehaviour
{
    public GameObject enemyPrefab;  // 在 Inspector 里拖入 Prefab

}

4.2 Instantiate 重载方法

cs 复制代码
// 方法1:只指定生成什么
Instantiate(enemyPrefab);

// 方法2:指定生成位置和旋转
Instantiate(enemyPrefab, position, rotation);

// 方法3:指定父物体(生成在指定物体下)
Instantiate(enemyPrefab, parentTransform);

// 方法4:完整版(位置+旋转+父物体)
Instantiate(enemyPrefab, position, rotation, parentTransform);

4.3 实例化后获取新对象

Instantiate 返回生成的新对象,可以立刻操作它:

cs 复制代码
void SpawnEnemy()
{
    // 生成并获取新对象
    GameObject newEnemy = Instantiate(enemyPrefab);
    
    // 修改新对象的属性
    newEnemy.name = "Enemy_" + Random.Range(1, 100);
    newEnemy.transform.position = new Vector3(0, 5, 0);
    
    // 获取组件并修改
    newEnemy.GetComponent<Renderer>().material.color = Color.red;
}

五、Destroy------销毁对象

5.1 基础用法

cs 复制代码
// 立即销毁对象
Destroy(gameObject);  // 销毁自己

Destroy(enemy);       // 销毁指定对象

Destroy(GetComponent<Rigidbody>());  // 销毁组件

5.2 延时销毁

cs 复制代码
// 2秒后销毁
Destroy(bullet, 2f);

// 延时销毁自己(常用于子弹、特效)
Destroy(gameObject, 3f);

六、对象池(简单了解)

频繁 InstantiateDestroy 会造成性能卡顿 (GC 垃圾回收)。优化方案是对象池------预先生成一批对象,用的时候"激活",不用的时候"隐藏",循环利用。

虽然我在这只是简单的说一下,但是这个是很重要的哦!更详细的内容我将在后续进行讲解。大家逐步跟着学就好啦!

对象池思路:

  • 初始化:生成 50 个子弹,全部 SetActive(false) 隐藏
  • 发射时:找一个隐藏的子弹,SetActive(true) 激活,重置位置
  • 命中时:SetActive(false) 隐藏,回到池中等待下次使用

七、按鼠标生成子弹脚本实现

那么看了我们上面的内容和之前的知识点,大家会发现这个脚本其实非常的简单对不对,也没什么特别困难的逻辑实现。那么我们就来写一写!

首先就是设置我们的预制体对象:

然后我们在每一帧进行一个判断我们有没有按下我们指定的按键对不对,如果按下了我们就生成一个子弹预制体,如果没有我们就不管。

最后我们还能给它加一个延迟销毁,我们的脚本就算完成了,是不是非常的简单!如果你想丰富内容可以给子弹设置位置和物理加速度,实现把子弹射出去!

运行结果展示:

可以看到点击鼠标后成功生成并在2秒后自动销毁,那么我们的任务完成!

**今天的教学就到这里!**接下来我将连续更新90天的Untiy教程从基础到一个网络部分,有兴趣的朋友们可以收藏关注,谢谢!如果有疑问,评论区见。

相关推荐
AnalogElectronic1 小时前
PHP学习02,PHP + jQuery + HTML + MySQL+nginx 做一个多用户云笔记项目
学习·php·jquery
SteveSenna2 小时前
aubo i5+pika realsense+ACT训练完整流程
人工智能·学习·算法·机器人
鱼鳞_2 小时前
Java学习笔记_Day30(File)
笔记·学习
AIHR数智引擎2 小时前
AI时代,德鲁克依然是答案——只是问题变了
大数据·人工智能·学习·职场和发展·机器人·求职招聘
talen_hx2962 小时前
emqx的Keep alive
java·笔记·学习
醇氧2 小时前
用 CC Switch (cc-sw) 配置 Claude Code 接入 阿里云百炼 (Dashscope)
人工智能·学习·阿里云·ai·云计算
FmZero2 小时前
后端全栈路线(9小时前端速成)
前端·vscode·学习
2501_9453184913 小时前
备考方案:针对数据分析师的知识结构,制定攻克赛一认证的最优学习路径
学习·百度
2301_7926748614 小时前
java学习day29(juc)
java·开发语言·学习