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将为资源启动编辑程序。

Unity3D中Prefab的更多相关文章

  1. 【转】Unity3D中脚本的执行顺序和编译顺序

    支持原文,原文请戳: Unity3D中脚本的执行顺序和编译顺序 在Unity中可以同时创建很多脚本,并且可以分别绑定到不同的游戏对象上,它们各自都在自己的生命周期中运行.与脚本有关的也就是编译和执行啦 ...

  2. Unity3D系列教程--使用免费工具在Unity3D中开发2D游戏 第一节

    声明:   本博客文章翻译类别的均为个人翻译,版权全部.出处: http://blog.csdn.net/ml3947,个人博客:http://www.wjfxgame.com. 译者说明:这是一个系 ...

  3. Unity3d中使用assetbundle

    1.导出assetbundle: ①单个资源导出成assetbundle: ②多个资源导出成一个assetbundle: 2.读取assetbundle: ①加载到内存: ②解压为具体资源. 1.导出 ...

  4. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

  5. Unity3D中可中途释放的单例

    Unity3D中可中途释放的单例 使用静态类,静态变量的坏处是从程序加载后就一直占用内存,想要释放比较麻烦,可是之前使用的单例,没有提供释放的方法,那是不是也同静态的一样直到程序结束菜释放?那单例的好 ...

  6. 图文详解Unity3D中Material的Tiling和Offset是怎么回事

    图文详解Unity3D中Material的Tiling和Offset是怎么回事 Tiling和Offset概述 Tiling表示UV坐标的缩放倍数,Offset表示UV坐标的起始位置. 这样说当然是隔 ...

  7. unity3d中 刚体(Rigidbody) 碰撞体(Collider) 触发器(Is Trigger)

      刚体(Rigidbody)的官方(摘自Unity3d的官方指导书<Unity4.x从入门到精通>)解释如下: Rigidbody(刚体)组件可使游戏对象在物理系统的控制下来运动,刚体可 ...

  8. Unity3D中Update()与FixedUpdate()的区别

    Unity3D中Update()与FixedUpdate()的区别是什么呢?从字面上理解,它们都是在更新时会被调用,并且会循环的调用.但是Update会在每次渲染新的一帧时,被调用.而FixedUpd ...

  9. Unity3D中C#和js方法相互调用

    通过查找资料,Unity3D中C#和js要相互调用彼此的方法,js文件必须放在"Standard Assets". "Pro Standard Assets" ...

随机推荐

  1. POJ 3122 Pie 二分枚举

    题目:http://poj.org/problem?id=3122 这个题就好多了,没有恶心的精度问题,所以1A了.. #include <stdio.h> #include <ma ...

  2. .NET EF 访问Oracle之问题小结

    由于最近手头上的项目要求使用Oracle数据库,所以我搭建了asp.net mvc + EF + bootstrap + log4Net + unity的三层框架,如下图所示: 其中单元测试使用微软自 ...

  3. XE5 安装破解

    以下转载自:  盒子 不可以将本破解补丁分享到国外网站.论坛中!低调啊! 本破解补丁只适合中国大陆地区的Delphi.C++Builder爱好者和开发者! 本破解补丁只可用于个人研究交流使用,不得做商 ...

  4. poj 1284 Primitive Roots

    从来没有接触过完全剩余系,不会证明,知道看了别人的题解才知道要用欧拉函数: 下面是证明过程: p是奇素数,如果{xi%p | 1 <= i <= p - 1} = {1,2,...,p-1 ...

  5. 如何用Python从本地将一个文件备份到Google Drive

    1.要有一个Google App账号: 这个可以上网上去申请,申请地址为:https://developers.google.com/appengine/?hl=zh-cn 2.创建一个Google ...

  6. 2.linux下Makefile编写规范

    转自陈皓 (CSDN) 概述—— 什么是makefile?或许很多Winodws的程序员都不知道这个东西,因为那些Windows的IDE都为你做了这个工作,但我觉得要作一个好的和 profession ...

  7. Sharepoint 2010 之 WebPart

    转:http://blog.csdn.net/bestbadgod/article/details/6895542 Sharepoint系列的博客,都是我个人自学过程中的点滴的积累,毕竟没做过C#及A ...

  8. HDU 5965 扫雷 【模拟】 (2016年中国大学生程序设计竞赛(合肥))

    扫雷 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submissi ...

  9. Linux文件虚拟机系统只读Read-only file system的快速解决方法

    问题描述:上周公司的私有云(底层架构是Openstack+KVM,目前稳定性还不够好,开发团队在改进中)一个计算节点挂掉,之后恢复后发现这个计算节点的所有Linux系统都变成只读了,复制文件提示:Re ...

  10. 设置Div多行文本超出时,以省略号代替

    这个文章不错 http://www.css88.com/archives/5206 css中有一个属性: text-overflow,可以设置文本超出指定长度后的文本截取样式. 下面是从 w3shco ...