Unity3D中Prefab

Prefab概念

        Prefab是一种资源类型——存储在项目视图中的一种可重复使用的游戏对象。因而当游戏中需要很多重复使用的对象、资源等时,Prefab就有了用武之地。它拥有以下特点:

    • 可以放到多个场景中,也可以在同一个场景中放置多次
    • 当添加一个Prefab到场景中,就创建了它的一个实例
    • 所有的Prefab实例链接到原始Prefab,本质上是原始Prefab的克隆。
    • 不论项目中存在多少实例,只要对Prefab进行了修改,所有Prefab实例都将随之发生变化。

       

创建填充Prefab

        为了创建一个Prefab,必须使用菜单构造一个新的空白Prefab,不包含游戏对象,因而不能创建它的一个实例。此时这个新的Prefab像一个空的container,想要使用它,必须用游戏对象的数据来填充它,让它不空。创建方法为Project视图中Create->Prefab(或导航菜单栏Assets->Create->Prefab),此时可以看到Project视图多了个灰色的小立方体,它就是创建的Prefab。

       填充Prefab很简单,只需要在Hierarchy视图中选择要成为Prefab的游戏对象,然后拖动该对象到刚才创建的Prefab上即可,此时可以看见灰色的小立方体变成蓝色了。此时,游戏对象和其所有子对象就已经复制到了Prefab的数据中,该Prefab可以在多个实例中重复使用。而Hierarchy视图中的原始游戏对象已经成为了该Prefab的一个实例。

        如果选择了一个Prefab实例,并希望做可以影响所有实例的变化,点击Inspector中的Select按钮选择源Prefab。


脚本实例化Prefab(运行时实例化Prefab)

       在运行时,通过Prefab实例化复杂的游戏物体是非常方便的。实例化Prefab的替代方法就是从一开始就使用代码来创建游戏物体,而实例化Prefab比替代方法有很多优势:

    • 可以用一行代码来实例化一个具有全部相同功能的Prefab,而用代码创建等效的游戏对象却要花费平均5行代码但可能更多。
    • 可以很容易地在Scene和Inspector视图中快速建立、测试和修改Prefab。
    • 可以修改实例化的Prefab却不需要改变实例化它的代码。例如,一个简单的火箭可被修改为超级火箭,却不需要修改任何代码。

       Unity中Object类含有两个实例化函数:

                 [c#]static Object Instantiate(Object original, Vector3 position, Quaternion rotation);

                       static Object Instantiate(Object original);

                 [javascript]static function Instantiate(original: Object, position: Vector3, rotation: Quaternion): Object; 

                                  static function Instantiate(original: Object): Object; 

       实例化函数跟编辑器中的Duplicate命令相似。克隆游戏对象可以有选择性地指定位置和旋转,默认为Vector3.zero和Quaternion.identity。假如克隆了一个组件那么附加的游戏对象也会被克隆;当克隆游戏对象或组件,所有的孩子对象和组件都会被克隆,它们的属性集跟源对象一样;但是克隆的新对象的父母却是null,当然想设置的话可以显示指定;克隆时游戏对象的状态也会被克隆,因而如果源对象是inactive的话克隆出来的对象状态也是inactive的。

可以看看利用instantiate实例化Prefab的例子:Instantiate应用的4个典型小例子


Prefab的继承

      继承是指不论什么时候当源Prefab发生变化时,这些变化将应用于所有已链接到该Prefab的游戏对象。例如,如果添加一个新的脚本到该Prefab,所有已链接到该Prefab的游戏对象都将立刻包含该脚本。但是,改变一个单独实例的属性并同时保持链接完整是可能。改变一个Prefab实例的任何属性,可以观察到属性变量名字变为粗体,现在该变量可以被重写,所有的重写属性不会受源Prefab变化的影响,这样就可以在保持Prefab链接不变的前提下,修改Prefab实例使它们变得独一无二。

        如果想用新的重写属性值覆盖源Prefab和所有实例,可以在Inspector中点击Apply按钮。注意,源的位置和旋转将不被应用,因为那样会影响到实例的绝对位置并把所有实例放在同一位置。但是从任何子或根的祖先的位置和旋转将被应用,因为他们是相对于根的Transform来计算的;如果想放弃对特定实例的所有覆盖更新,可以点击Revert按钮。


破坏与恢复Prefab链接

        某些行为可以打破源Prefab和单个Prefab实例之间的链接,但是链接总是会被修复的。可以打破链接的行为有:

    • 添加或删除一个组件
    • 添加或删除一个子对象
         这些行为将给出链接打破的警告/确认消息,如果确认这样的行为将会破坏链接 。若要修复该链接,可以在Prefab实例的Inspector视图中点击Reconnect或Apply按钮。Reconnect将会丢弃与源Prefab的所有差别,而Apply将会将所有的差别复制到源Prefab中,因此所有其他的Prefab实例都会受到影响。      

导入的Prefab 

     当放置一个网格资源到资源文件夹时,Unity会自动导入文件并生成一些类似于Prefab的网格,而实际上并不是网格,只是资源文件本身。在进行正常预置工作时,资源的实例化名没有某些限制。

       资源是作为一个游戏对象在场景中被实例化的,被链接到源资源却不是一个Prefab。资源作为正常的游戏对象,可以添加和删除组件。然而,不能对这个资源本身做任何变动,因为这将给资源文件本身添加数据!如果要创建一些需要重复使用的东西,应该将资源实例制成一个Prefab,步骤同创建Prefab,只不过是拖拽资源文件到新建的Prefab即可。

       当选择了一个资源的实例,Inspector视图中的Apply按钮将被替换为一个Edit按钮,点击该按钮将为资源启动编辑程序。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值