Unity入门计划基本概念-预制件 Prefab
Posted 九九345
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity入门计划基本概念-预制件 Prefab相关的知识,希望对你有一定的参考价值。
目录
官方文档
相关教程
我的Unity版本
2021.3.6
1 预制件的作用
unity中我们通常需要给游戏对象添加一些比如刚体、碰撞体等组件实现一些效果。但当遇到同一个NPC、场景中的道具在场景中需要被重复使用时,如果只是一步一步重复添加组件,效率会非常低,这是我们就希望把同一种需要复制的对象打包起来,需要用的时候直接复制粘贴即可。
预制件就是unity提供给用户的一个实现上述操作的资源类型。
2 预制件的定义
- 预制件(prefab)是一种assert资源类型;
- 预制件用于存储游戏对象(GameObject)对象以及配套的组件和属性;
- 预制件充当一种模板功能,是一个可重复使用的资源模板;
3 预制件的优点
既然它是一个打包好的资源模板,那么优点就清晰可见了。它可以轻松的大范围的修改项目的内容,无需对每个单一对象进行重复编辑,节省了大量的时间。
4 一般使用的场景
- 环境资源——很多的山、树等,会预先做好再导成预制件
- 武器的炮弹——大炮发射的实例化炮弹预制件
- 玩家——玩家预制件会被放在各个关卡的起点位置
5 预制件的创建&使用
5.1 创建
- 在文件夹右键 -> Create -> Prefab,就可以创建一个预制件;
- 将场景中想要实现复制的对象拖到这个预制件资源 -> 弹出提示框没选择Replace -> 就创建了一个可重复使用的资源模板;
- 此时, 原本的对象前面的图标也改变了,从线框 -> 实心 ;属性面板也多了Prefab属性。
5.2 使用
使用就很简单了,要么直接拖入Scene视图,要么ctrl+D复制即可。
6 预制件的编辑
6.1 更改预制件本身
双击进入预制件,就会把关注集中在预制件本身,给他做修改、添加组件即可。同时预制件设置的操作,会在场景中所有由预制件生成的实例对象做更改。
6.2 更改实例对象
如果在预制件生成的实例对象做更改,修改后,需要在Inspector面板上方的Prefab栏 -> Overrides做操作
- Revert All——还原到预制件
- Apply All——修改预制件的值
还可以单独做更改,同时对应的Revert和All意思跟上面的一样。
6.3 实例属性优先于预制件
需要注意的点是,如果在预制件生成的实例对象里对某个值做了修改以后,这个值就会被覆盖掉,再在预制件中进行修改是不会改变当前实例对象的值的。
这个很好理解,预制件相当于所有子对象的父类,生成的实例子对象是子类,父类的操作总是在子类之前的,因此子类就具有修改所谓的优先性,属性的修改也优先于预制件。
7 预制件变体 Prefab Variant
直接引用UP教程举例的关系图:
预制件变体是由原来预制件创建出来的新的预制件,在保留了原来预制件的基础上,还添加了新的特性,这些预制件变体还可以变出自己的变体,再由这些变体生成对应的不同的对象。
7.1 预制件特点
- 预制件变体继承基础预制件的属性
- 预制件变体的属性覆盖优先于基础预制件
7.2 预制件的创建
- Project面板 -> 右键想要当作基础预制件的Prefab -> Create -> Prefab Variant
- 直接拖入想要当作预制件变体的对象,会有提醒是否创建预制件变体
8 预制件unpack成对象
如果不想让预制件继续充当预制件了,在hierarchy窗口右键,Prefab -> unpack,就能解包成一个单纯的游戏对象了。
Unity快速入门教程-详解预制体(Prefab)及其实例化Instantiate
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
博主刚学习unity的时候,在网上找预制体相关的博客,可是很难找到一篇凝练且通俗易懂介绍预制体的文章,浪费了不少时间且难以理解一些文章的内容。自己摸索学习了一段时间过后,总算对预制体有了一定的了解,现在本篇文章将凝练的讲一讲unity中的预制体及其实例化。
提示:以下是本篇文章正文内容,下面案例可供参考
一、预制体(Prefab)是什么?
1.1预制体简介
大家平时点的外卖,其菜品很多就是通过预制菜制作的,预制菜的主要特点是规格统一且经过简单加工即可制成成品。我们可以把现实中的预制菜比作unity中的预制体,厨师加工预制菜的过程就是预制体实例化的过程,这里的厨师其实就是instantiate函数,通过函数将预制体实例化。厨师用预制菜制作出了一道成品菜,就是instantiate函数实例化了一个预制体,将该预制体呈现在场景中。
1.2预制体是什么样子的?
预制体可以有多种元素组合而成,所谓的元素一般是游戏素材,比如图片,模型等,将所有的元素打包成一个物体,这个物体就是所谓的预制体。
如图样例就是一个命名为【GameObject】的预制体,它包括了场景中出现的所有元素(房子,马路,树木,栅栏,草丛),函数实例化该预制体后,游戏场景中就会一齐出现房子马路等元素的一个集合。
1.3预制体作用与用途
在一个游戏项目中,场景可能就是由许多个预制体拼凑而成,每个预制体组成了场景中的一点部分元素,比如要制作一个无限大的地图,通常游戏就会设置当主视角接近场景边界的时候,就往外随机生成一个预制体场景,这样就能实现无限大地图的效果。预制体的使用就会大大方便对地图元素的管理。
如果你要制作一把游戏枪械,当枪械激发时你想做出一颗颗子弹出枪膛的效果,那么子弹也可以做成一种预制体,不断在枪口实例化,且实例化之后沿着枪口方向移动。
二、制作一个预制体
2.1制作预制体示例
我们首先将素材拖入场景界面,可以根据你对游戏场景的设计,摆出你希望的预制体的样子,你所设计的样子,就是以后预制体实例化的样子。
然后我们创建一个空的物体,将我们所添加的元素全部并入到该空物体,成为其子项。
最后,我们将【GameObject】拖入到Project的一个文件夹,至此,一个预制体就制作完成了。以后要使用该预制体的时候,我们就可以从Project中实例化该预制体。保存好之后就可以把场景【Hierarchy】里面的【GameObject】删去了,保存【Project】里面的源预制体即可,因为我们实例化调用的是项目里面的源预制体。
2.2预制体实例化
要实例化一个预制体,我们首先要代码获取到源预制体,然后在通过Instantiate函数将获得的源预制体实例化。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
//预制体是用GameObject类型
public GameObject prefab;
我们可以通过pubic来获取外部的源预制体,pubic可以在编辑器界面生成一个面板窗口,随后将源预制体拖放到【Test】脚本下的【Prefab】窗口。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Test : MonoBehaviour
public GameObject prefab;
private void Start()
Instantiate(prefab);
在脚本中加上Instantiate(prefab),保存代码返回编辑器中点击play运行,即可简单的将预制体实例化,生成刚刚所设计的场景在游戏中。
总结
本文只是简单的介绍了Instantiate函数的最简单用法,Instantiate函数还可以设置更多参数,比如初始化预制体的位置,旋转角度等,比如
Instantiate(prefab, new Vector3(0,0,0), Quaternion.identity);
以上是关于Unity入门计划基本概念-预制件 Prefab的主要内容,如果未能解决你的问题,请参考以下文章
Leap Motion 之Unity 开发指南(一. 基本概念与制作手预制件)
Unity入门计划基本概念-2D刚体Rigidbody 2D
Unity入门计划基本概念-2D碰撞体Collider 2D