Unity学习笔记2之预制体Prefab的使用

预制体的引入

预制体恐怕是最常用的功能之一,我们可以通过使用预制体系统去创建,配置,储存一个游戏对象的所有组件,属性值以及子物体(transform属性是例外,下面再说明)。存储好的游戏对象,就成为了一个可重复使用的资源和模板,可以方便的创建预制体的实例
作为Unity最基础重要的功能之一,预制体的使用还是有很多注意事项的,下面我对他们进行一一说明。

预制体的创建和使用

创建非常简单,只需要将目标从Hierarchy面板拖到Project面板,就可以了。在Hierarchy面板中预制体会显示为蓝色。(如图所示)
Unity学习笔记2之预制体Prefab的使用_第1张图片
使用起来同样非常方便,只需要将做好的预制体拖到Hierarchy面板或者Scene面板就可以了。如图我拖拽了三个预制体的实例,他们除了位置不同,其他信息都是一样的。
Unity学习笔记2之预制体Prefab的使用_第2张图片

预制体的编辑修改

预制体系统的优势之一就是可以通过修改预制体本身来修改所有预制体的实例,比如我通过修改预制体中小球的Scale就使得场景所有实例的黄色小球都变小了。
Unity学习笔记2之预制体Prefab的使用_第3张图片

修改编辑有两种方式。其一可以通过双击Project面板中的预制体,进入修改模式(该模式会实时保存)。其二也可以修改某一个实例,然后点击apply,将实例的变化应用到预制体上。
Unity学习笔记2之预制体Prefab的使用_第4张图片

如图所示,在改变实例小球大小之后,该实例的Inspector面板的下拉框中会提示我们小球的Transform发生了改变(也就是这个数值被我们Override重写了),点击Revert可以复原,点击Apply可以将小球的改变反过来应用到预制体上,也就是可以传播给其他实例身上。
这里注意一点,预制体是不会控制实例的位置属性的。很好理解,因为要把实例放在不同的地方,统一控制他们的位置和转向没有意义,所以具体来说就是编辑预制体的Transform下的Position,Rotation,Rect Transform下的Width, Height, Margins, Anchors和Pivot对实例都没有影响。

预制体实例的重写

我们常常有这样的需求,比如通过一个“树”的预制体来制作一片小树林,但树有高矮胖瘦,如果每棵树都一样则会十分违和,此时就可以利用预制体实例的重写功能。

重写分为四种:

  1. 改变属性值(比如改变小球Scale大小)
  2. 增加组件
  3. 移除组件
  4. 增加子物体
    (不允许删除子物体,可以禁用子物体起到同样的效果)
    Unity学习笔记2之预制体Prefab的使用_第5张图片

如图我将中间实例的小球放大了,这样的改变不会影响其他的实例(除非像上面那样将重写应用到预制体上Apply Overrides),他就变得“与众不同”。
值得注意的是,预置实例上重写的属性值始终优先于预置资源的值,也就是说,当我们再次修改预制体中小黄球的大小,预制体会将修改信息应用到所有实例上,但对于中间的物体,由于我们修改过小球的大小,这是一个重写信息,优先级更高,会覆盖掉预制体资源的信息,大小不会听预制体的指挥
这也就是为什么,如下图所示的,我们修改预制体的小球形状,左右两边两个实例都随着预制体改变了,中间的没有发生改变。正是因为中间实例对小球的Scale信息重写了,覆盖了预制体的值,所以改变小球Scale的命令对他不起作用了。
Unity学习笔记2之预制体Prefab的使用_第6张图片

当然预制体改变其他值依旧对中间的实例有效,因为它仅仅覆盖了子物体小球的Transform组件的Scale值。(如果仅仅覆盖了Scale.X,修改Y,Z的值也依旧会跟着改变。)
Unity学习笔记2之预制体Prefab的使用_第7张图片

想要取消覆盖,可以通过上文提到的预制体下拉面板中的Revert还原单个或者全部属性,手动将属性更改得与预制体原型一样是没有用的。

预制体的嵌套

预制体嵌套和变体(Nested Prefabs&Prefab Variants)是2018版本后的新功能,有效的补充了unity的预制体系统。
嵌套顾名思义,指一个预制体放在另一个预制体下做为子物体。举个例子,一款游戏中制作了一个机器人的预制体,场景中街上放置了几个机器人实例,街边餐馆里也放置几个机器人,同时将这个街边餐馆作为一个预制体存储起来,方便应用到其他场景中。如果此时,机器人需要调整,那么嵌套系统就保证了我们只要修改机器人的预制体原型,不但街上的机器人都会修改,餐馆预制体里的机器人实例也跟着得到了修改,大大方便了游戏制作
Unity学习笔记2之预制体Prefab的使用_第8张图片

如图我制作了一个蓝色圆柱预制体并将其作为了右边预制体实例的子物体,当我修改圆柱预制体的大小,右边预制体实例中嵌套的圆柱预制体实例也会跟着修改。

预制体的变体

变体也非常好理解,再利用上面提到的机器人例子,我设置了一个机器人原型,但有的机器人在餐馆工作,有的机器人负责交通指挥,此时自然会想到上面提到的实例的重写,给不同工作的机器人添加上不同工作需要的GameObject和脚本。但是问题在于餐厅服务员机器人有很多个,如果单纯像上面那样对着机器人实例,一个一个的修改重写,非常麻烦。于是就有了变体的功能,也就是可以将基于一个“父类”预制体的变体“子类”也作为一个预制体原型。(十分类似于编程的继承)。
Unity学习笔记2之预制体Prefab的使用_第9张图片

再看回上图,右边是我们原本的预制体的实例,左边是一个变体,多了一个蓝色的圆柱体。当我需要很多个这样带有蓝色圆柱的变体时。我们可以通过将该特殊实例从从Hierarchy面板拖到Project面板的操作来将这个变种作为一个预制体。
此时unity会询问是 将这个特殊变体作为”Original Prefab“还是”Prefab Variant“。
前者意思是将他制作成全新的预制体,切断与之前父类的联系。
而后者则指的是作为一个”子类“存在,虽然变体制成了一个预制体,但父类的改变依旧会影响它。
就好比虽然通过那个原始机器人预制体,制作了许多服务员,交警等不同职业的机器人预制体变体,但我们需要给机器人添加刚体组件,直接给原始父类机器人预制体身上添加刚体组件,所有服务员,交警机器人也会自动添加好该组件。非常方便快捷
Unity学习笔记2之预制体Prefab的使用_第10张图片

如图,左边是Cube的变体,在Hierarchy面板中,变体图标也会有所不同。当我们拉伸Cube预制体时,预制体变体也会相应拉伸。

实例的解绑

对场景中的一个预制体实例,当我们不需要它受到预制体约束的时候,可以将其(Prefab Unpacking)解除绑定。只需要对着Hierarchy面板中的物体右键选择“Prefab Unpack”或者“Prefab Unpack Completely”即可。
选择“Prefab Unpack”的话,如果目标实例中,存在其他预制体的嵌套,则嵌套的预制体仍然是预制体实例,并且仍有指向各自预制体资源的链接。意思是如果将我们上面的餐厅预制体解绑,餐厅里的机器人并没有解绑,依旧还是机器人预制体的实例,会听从指挥。
类似地,如果您解压一个预制体变体,那么它会退回成预制体父类的实例,依然还是听从父类预制体的指挥。也就是对餐厅机器人解绑的话,它会变成普通原始机器人的实例。

如下图所示,我解绑了Cube变体的实例,该实例会蜕变成了Cube实例,图标变成了预制体实例图标,只存在于变体中的圆柱体左边出现了加号,系统认为是对Cube预制体的重写。
Unity学习笔记2之预制体Prefab的使用_第11张图片

如果选择“Prefab Unpack Completely”,则会完全断开所有子物体的所有预制体链接。成为一个普通的GameObject。

结语

到此为止,Unity预制体的内容就全部梳理完了,简单的内容却花了整整一下午的时间。
感谢大家看到这里,希望能对你有所帮助,如有错误不足,欢迎指正。

你可能感兴趣的:(Unity学习笔记,unity,游戏开发,unity3d)