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非常easy。仅仅须要在Hierarchy视图中选择要成为Prefab的游戏对象,然后拖动该对象到刚才创建的Prefab上就可以。此时能够看见灰色的小立方体变成蓝色了。此时。游戏对象和其全部子对象就已经拷贝到了Prefab的数据中,该Prefab能够在多个实例中反复使用。而Hierarchy视图中的原始游戏对象已经成为了该Prefab的一个实例。

        假设选择了一个Prefab实例,并希望做能够影响全部实例的变化,点击Inspector中的Selectbutton选择源Prefab。


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

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

    • 能够用一行代码来实例化一个具有所有同样功能的Prefab。而用代码创建等效的游戏对象却要花费平均5行代码但可能很多其它。
    • 能够非常easy地在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中点击Applybutton。

注意,源的位置和旋转将不被应用。由于那样会影响到实例的绝对位置并把全部实例放在同一位置。可是从不论什么子或根的祖先的位置和旋转将被应用。由于他们是相对于根的Transform来计算的;假设想放弃对特定实例的全部覆盖更新。能够点击Revertbutton。


破坏与恢复Prefab链接

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

    • 加入或删除一个组件
    • 加入或删除一个子对象
         这些行为将给出链接打破的警告/确认消息。假设确认这种行为将会破坏链接 。

若要修复该链接,能够在Prefab实例的Inspector视图中点击Reconnect或Applybutton。Reconnect将会丢弃与源Prefab的全部区别,而Apply将会将全部的区别拷贝到源Prefab中,因此全部其它的Prefab实例都会受到影响。

     

导入的Prefab 

     当放置一个网格资源到资源目录时,Unity会自己主动导入文件并生成一些类似于Prefab的网格。而实际上并非网格。仅仅是资源文件本身。

在进行正常预置工作时,资源的实例化名没有某些限制。

       资源是作为一个游戏对象在场景中被实例化的,被链接到源资源却不是一个Prefab。资源作为正常的游戏对象,能够加入和删除组件。然而,不能对这个资源本身做不论什么变动,由于这将给资源文件本身加入数据。假设要创建一些须要反复使用的东西。应该将资源实例制成一个Prefab,步骤同创建Prefab,仅仅只是是拖拽资源文件到新建的Prefab就可以。

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





本文转自mfrbuaa博客园博客,原文链接:http://www.cnblogs.com/mfrbuaa/p/5327979.html,如需转载请自行联系原作者

相关文章
|
缓存 安全 Linux
强大的动画插件——DOTween介绍(Unity3D)
DOTween是一个用于Unity的快速、高效、完全类型安全的面向对象动画引擎,为c#用户进行了优化,是免费和开源的,具有大量高级特性 DOTween兼容Unity 2019至4.6版本。 适用于:Win, Mac, Linux, Unity WebPlayer, WebGL, iOS, Android, Windows Phone, Windows Store, PS Vita (PSM), PS3/PS4, Xbox 360/One,任天堂Switch + more(没有测试额外的平台,但除了Flash导出,它应该可以在任何地方工作)
|
7天前
|
图形学 C++
【Unity Shader入坑篇---有ASE创建Unity Shader,那么Unity Shader代码的相关知识还有必要学或了解吗?】
【Unity Shader入坑篇---有ASE创建Unity Shader,那么Unity Shader代码的相关知识还有必要学或了解吗?】
|
7天前
|
图形学
【Unity Shader 中SubShader相关介绍】
【Unity Shader 中SubShader相关介绍】
|
4月前
|
数据可视化 图形学 流计算
Unity 操作常用控件(下)
Unity 操作常用控件(下)
|
7月前
|
图形学
unity动态添加 EventTrigger
动态添加 EventTrigger
|
10月前
|
图形学
【unity细节】unity物体Model和prefab的区别
【unity细节】unity物体Model和prefab的区别
143 0
|
图形学
Unity Shader Graph 制作 Fade 淡入淡出效果
Unity Shader Graph 制作 Fade 淡入淡出效果
522 1
Unity Shader Graph 制作 Fade 淡入淡出效果
UGUI系列-实现进度条效果(Unity3D)
今天分享一个UGUI 图片实现进度条动画的方法,配合上资源异步加载,可以作为场景加载动画
|
Java 图形学
[unity]Unity3d获取APK签名及公钥的方法
在Unity3d项目中获取APK包签名公钥的方法,核心思想就是通过JNI调用Android提供的方法。不过Unity3d提供了比JNI更上一层的类AndroidJavaObject以及继承它的AndroidJavaClass,帮助开发者省去很多工作。
1658 0
|
图形学
[Unity Editor] 清理Prefab使用的特定组件
工具实现 修改Prefab有两种方式,1)实例化Prefab,修改GameObject的实例,然后再替换工程里的资源(SaveAsPrefabAsset)。2)通过SerializedObject直接修改Prefab资源。
2409 0

热门文章

最新文章