• 96次航拍峨眉 换个角度看巴蜀名山 中国国家地理网 2019-04-23
  • 俄罗斯电影《最后一球》定档落魄球星遇上菜鸟球队 2019-04-21
  • 【理上网来·辉煌十九大】缅甸资深媒体人高度评价习近平十九大报告:立意高远 内涵丰富 2019-04-21
  • 特朗普和金正恩先后抵达嘉佩乐酒店 会晤即将开始 2019-04-17
  • 中国侨联直属机关党委举办党务干部培训班 2019-04-17
  • 上海合作组织青岛峰会举行 2019-04-07
  • IT热点小度智能音箱发布 新飞电器破产拍卖 2019-04-04
  • 台州公务员管理再也不用“往返跑”了!“最多跑一次”撬动组织人事改革 全省首个试点 2019-04-03
  • 我要讨干嘛?姜太公钓鱼,愿者上钩。 2019-04-03
  • 新疆花开天山南北 笑迎八方来客 2019-03-25
  • 机器人占领就业市场后:人类还能从事这些工作 2019-03-04
  • 以网络文化建设推进文化惠民 2019-03-03
  • 贸易战,只能是双输。我们是众志成城,美国却不一定。 2019-02-26
  • 辣评2016年9月最HOT 轿车获奖榜单 2019-02-22
  • 交通运输部路网中心:端午假期高速通行不免费 2019-02-18
  • 南粤风彩36选7开奖洁果: 士郎 新版Prefab的一些梳理

    28
    回复
    3022
    查看
    打印 上一主题 下一主题
    [ 复制链接 ]
    排名
    1
    昨日变化

    福建36选7和值走势图 www.00-na.com 7608

    主题

    8154

    帖子

    3万

    积分

    Rank: 16

    UID
    1231
    好友
    186
    蛮牛币
    10030
    威望
    30
    注册时间
    2013-7-29
    在线时间
    3927 小时
    最后登录
    2019-4-25

    活力之星原创精华达人突出贡献奖财富之证游戏蛮牛QQ群会员蛮牛妹VIP

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?注册帐号

    x


    前言
    Unity的Prefab相信大家一定很熟悉了,但是用起来那叫个又爱又恨,爱是因为它方便,恨是因为它不支持嵌套,经过大家的各种报怨,终于在Unity2018.3.0f2中迎来了功能支持~

    先说下Prefab都有哪些好处吧:
    • 类似模版的概念,修改基本Prefab,所以实例都会相应的更新改变。(这也是原本Prefab就有的功能,也是最基本的功能)
    • 嵌套,可多级嵌套,在角色、UI、特效等上都有很大的发挥空间。
    • 变体,在做同一类型资源(有不同外观或属性)但是又希望每一个都是个Prefab时比较有用。



    好处了解完后,接下来就详细的从头到尾来捋一捋。


    Prefab
    首先要说下如何生成Prefab,以一个机器人Robot(利用一些基本Cube拼出一个机器人)为例:



    利用一些Cube拼出的机器人

    如何生成Prefab?
    • 首先在Hierarchy面板中创建出我们的机器人,并且把所有的部件都放在一个叫Robot的空物体下面。(因为我们是要把整个机器人做为Prefab来保存,所以需要把它们组合到一个对象下面来管理)、


    • 在Hierarchy面板中,将Robot拖到Project面板内(具体拖到哪个文件夹可自由决定),即可在相应的文件夹内生成Robot的Prefab。

    在Hierarchy面板中,对象名称左边有个小图标,在普通情况下它是一个灰白色的小方块,而当它是个Prefab实例时,则是一个蓝色的小方块,这是在Hierarchy面板区分物体是否为Prefab的一个直观的方式。


    在Project面板中,Prefab是以.prefab为后缀命名的。

    如何编缉Prefab?
    有多种方式可以对Prefab进行编缉,这里编缉的意思是指对Prefab本身做修改,以使修改自动更新到所有的实例中。

    • 第一种方式是在Prefab Mode中进行编缉。

    Prefab Mode是新版中的新术语,意思就是进入一个独立的空间中,在其中对Prefab进行修改编缉。
    • 第二种方式是在外面进行,也就是普通界面下进行修改编缉。



    Prefab
    Prefab Mode

    要在Prefab Mode中编缉,首先就要进入到此模式下,有以下几种进入方式:
    • 在Hierarchy面板中,Prefab对象的最右侧有个向右的小箭头,通过点击此箭头即可进入Prefab Mode中。



    • 从Hierarchy进入Prefab Mode
    • 同样是在Hierarchy面板选中Prefab后,在Inspector面板最上方会显示"Open"字样的按钮,点击Open即可进入。


    从Hierarchy选中对象并从Inspector面板中进入Prefab Mode





    • 在Project面板中,选中Prefab后,在Inspector面板中会显示"Open Prefab"字样的按钮,点击即可进入。



    从Project进入Prefab Mode

    进入后呈现如下所示:


    Prefab Mode

    • 一级一级的退出Prefab Mode,每点一次回退一级。
    • 点击标签可以回退到指定的上一级,多级嵌套时可以方便的回到某个层级中。
    • Auto Save,自动保存,默认勾选,在Prefab Mode中所做的任何修改都会自动进行保存。如果电脑性能不佳,有出现卡顿感时,可以选择去掉勾选,在需要时主动点击Save按钮(当去掉勾选时,在其左边会出现Save按钮)。另外,当去掉勾选,同时也做了一些修改,但是在没有点Save后,直接选择退出Prefab Mode,此时会弹出一个提示对话框,需要选择是否对修改进行保存?;故窍嗟碧牡?。



    Editing Environment
    编缉环境,什么意思呢,就是说当我们进入Prefab Mode时,默认使用的都是一个只有天空盒的空场景,那如果我们想要换个场景怎么办呢?
    通过Edit>Project Settings>Editor打开工程设置界面:



    设置Editing Environments
    在此设置界面中有两个Environment可供设置:

    Regular Environment:常规Prefab的编缉环境,常规是什么意思呢,其实就是非UI类的都属于常规类,也就是说凡是Prefab父级是Transform的都会用这个环境。

    常规类用Regular Environment



    UI Environment:UI类的Prefab编缉环境,凡是Prefab父级是RectTransform的都会用这个环境。



    UI类用UI Environment

    实例
    现在把Robot Prefab从Project中拖入Hierarchy中,也就表示在场景中生成了一个Robot的实例,然后再拖进来一个,移动一下它的位置,至此,我们在场景中有了两个Robot的实例。


    大部分情况下,我们都希望生成出来的实例是有些稍稍不同的,比如某个Robot大一点,某个Robot又高一些,甚至某些Robot有些额外的部件等等。
    总体而言呢,会有以下几种类型的不同:
    • 属性值的不同
    • 组件的新增与删除
    • 子物体的添加



    注意,除此以外的操作会要求进入到PrefabMode模式下更改,说明在实例上不支持,必须修改Prefab本体才行。比如子级排序变更、子对象的删除等操作。
    删除子对象的操作可以采用在Inspector面板中禁用显示来变相达到需求。

    当实例上有修改时,在Inspector界面中会以一个蓝色条状进行标示,以示区别。

    Prefab实例修改后的标记


    覆盖与恢复
    概念
    覆盖与恢复操作是Prefab实例中很重要的两个概念:

    • Overrides(覆盖)

    将实例中所做的修改覆盖应用到原始Prefab中去,此操作会更新所有的实例。
    比如场景中有1000个机器人实例,当把其中一个改成2倍大,然后将其覆盖,此时场景中所有的实例都会变成2倍大。(前提是另外那999个机器人的缩放值没有修改过)
    • Revert(恢复)

    将某个实例上的修改移除,并恢复到原始Prefab上的状态。

    覆盖与恢复(方法一)
    实现覆盖与恢复的方法很多,先说第一种,当我们选中实例时会在Inspector面板顶部显示三个按钮:

    • Open:进入Prefab Mode
    • Select:在Project面板中选中此Prefab
    • Overrides:覆盖或者恢复实例上的修改

    其中覆盖与恢复操作就在Overrides中,默认情况下点击Overrides时,由于实例上没有任何修改,所以不会有覆盖与恢复相关的按钮,如下所示:



    实例上的基本操作



    对象的Position与Rotation属性有修改时,不会算作Overrides,也就是说我们在实例上不管怎么修改位置与旋转都不会产生覆盖操作,同理,当我们修改了Prefab自身的位置与旋转值时也不会影响到任何实例。



    注意Scale值会被收集到Overrides中。

    当实例上产生可覆盖的修改时,面板将显示如下:



    • Revert All:恢复实例的所有修改到Prefab原始状态,也就是移除所有修改,回复到默认状态。
    • Apply All:将此实例上的所有修改都覆盖到Prefab本身,此操作会影响到所有的实例。
    • 当一个实例有修改时,会在此处列出每个修改块,通过点击可查看具体的修改信息。
    • 查看每个修改块的具体修改内容,如果是新增的就会单独以Added的形式展示,如果是原先Prefab就有的,则会显示出两者的对比,便于参照,可以说是非常良心了。同时在此小面板的右上角有Revert和Apply两个按钮,与1、2大同小异,只不过是单独针对选中的对象进行操作的。


    覆盖与恢复(方法二 )
    第二种方法,还是在Inspector面板中,在修改属性的上面点击右键,从而会弹出相关的命令,如下图所示:

    在Component上覆盖与恢复Prefab





    Apply to Prefab "XXX",表示将此条修改覆盖到原始Prefab中。
    Revert表示恢复此条修改。
    添加与删除组件也可以用此方法来弹出操作命令,这里不再详细说明。
    此种方式在修改了单独的属性并想快速覆盖与恢复时比较常用。

    覆盖与恢复(方法三 )
    第三种方法,这回是在Hierarchy面板中,在对象上点击右键,如下图所示:



    注意,此种方法只能对新增的子物体进行覆盖与恢复,无法针对组件以及对象上的属性修改做覆盖与恢复操作。



    这三种方法,各有各的针对情况,第一种方法最全面,但是相对要小心处理,第二方法针对组件上的属性与添加和删除组件很好用,第三种方法主要针对添加子物体时的操作。所以三种方法相互配合才是提高操作效率的最佳手段。



    嵌套Prefab
    新版中最重要的功能就是支持嵌套了,实际操作起来也是非常简单,重要的一些概念在上面都已经讨论过了。
    如下图中,我们将Robot的各个部件都单独生成一个Prefab并且放置于Robot内,这就形成了嵌套Prefab。
    Prefab中的嵌套Prefab





    嵌套的Prefab的本身就是Prefab,把它当作常规Prefab就行了,只不过在新版本中,可以将它放在其它Prefab内,并同时保留自身的引用关系,当本体更新时它也会自动更新,这在以前的版本中是做不到的。


    同时也支持多级嵌套,即Prefab中有子Prefab,子Prefab中又可有自己的子Prefab。。。以此类推,具体不清楚有没有嵌套层级数量限制,理论上来讲应该是无限的。



    Prefab变体
    此概念也是新版本中的功能,具体是什么意思呢?

    试想一下,假如我们的Robot是一个怪物,那么我们现在想要多个怪物,但是它们外观又不大一样,并且各自的属性也不太相同,同时呢,它们又都是属于Robot类,也就是说,我们要生产一批类型差不多但稍有细微差别的一组Robot。

    按照以前的做法,我们肯定是生成多个Prefab,各个Prefab不相关,不同的外观不同的属性,一旦想改变所有的属性时就必须要去一个个的修改,这是及其不方便的。


    那么Prefab的变体就是为了解决此类问题而生的。
    利用Prefab变体我们就可以快速生成多个Prefab,同时我们可以给予它们不同的外观与属性,但是它们又共同继承自原始的Prefab,当我需要整体都改变时只需调整最原始的Prefab即可。



    如何创建Prefab变体
    在Project面板中,在原始Prefab上点击右键,从中依次选择Creat>Prefab Variant即可。


    创建Prefab变体菜单
    然后在原始Prefab边上就会出现一个变体资源,注意图标样式与普通Prefab是不同的。


    生成Prefab变体
    这个时候就可以像修改普通Prefab一样的去修改变体Prefab了,但是有一点千万要注意:
    在变体的Prefab Mode中,选中Prefab最上层时的Overides下覆盖按钮变成了Apply All to Base,此命令会使用变体的修改去覆盖原始Prefab,请千万明确此操作确实是你想要的再去点。


    通常情景下,变体是不会去覆盖本体的,否则就失去了变体的意义了。



    变体上的覆盖到基类
    下图简单展示了一个变体与本体的效果差别:
    变体比本体中多了脚的部件,同时头部的属性值也发生了变化。
    此时当我们去修改本体属性时,变体也会自动更新。这就是变体的核心方便之处。

    变体与本本




    Prefab解散
    同样,新功能,其实Prefab确实很像一个组,组内包含各式各样的部件与组件,那既然是一个组,那就有解散组的可能性。
    所以官方也是考虑到了这一点,也提供了相应的功能支持。

    如何解散
    • 首先解散操作只能在实例上进行操作,也就是只能在Hierarchy中进行。所以先在Hierarchy中选中Prefab实例。
    • 然后右键,从中选择Unpack Prefab或者Unpack Prefab Completely。




    Prefab解散
    • Unpack Prefab:解散Prefab与本体的关联,此时在Hierarchy面板中父级会变成灰色图标,表示不再是一个实例。在Inspector面板中Prefab相关的操作也会消失。但是子级的Prefab属性还是存在的。(如果子级有Prefab的话)
    • UnPack Prefab Completely:完全解散Prefab,此时不管是父级还是多深的子级全部失去与各自Prefab的关联,也就是纯纯粹变成了场景中的一组对象而已。



    在对Prefab变体实例Unpack Prefab后,它会首先解散成普通Prefab(此时与原始Prefab会进行关联)。当再次执行Unpack Prefab后才会失去与本体Prefab的关联。


    运行时覆盖
    新版本同时也带来了一些新的问题,除了API需要更新以外,运行时修改并覆盖的功能也没了,在之前运行时选中Prefab实例,在Inspector面板是有Apply按钮来覆盖修改的,但是新版本中就完全消失了,这个功能对于美术特效人员来说非常重要,可以在运行时边调效果边保存,虽说也可以手动拖到Project面板中来覆盖保存,但未免总是有些不方便,于是抛砖引玉,给出下面这段运行时保存的代码:


    运行时保存代码



    工具界面最终如下:

    工具界面
    大概思路:
    设想利用EditorWindow做成一个小工具窗,其中有一个按钮,在运行时修改完特效后选中此特效的父级直接点击按钮即可。
    由于新版本中运行时Prefab实例会丢失与原始Prefab的关联(目测是这样),所以只能通过名称在相应的目录内来查找,查找到后进行替换,否则提示找不到。
    此工具只是抛砖引玉,通用性太差,如果大家有更好更方便的方法请留言回复。

    知乎@taecg



    参与人数 1鲜花 +2 收起 理由
    Coool + 2 赞一个!

    查看全部评分总评分 : 鲜花 +2

    7日久生情
    1640/5000
    排名
    4093
    昨日变化

    0

    主题

    990

    帖子

    1640

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    254705
    好友
    1
    蛮牛币
    1549
    威望
    0
    注册时间
    2017-11-16
    在线时间
    288 小时
    最后登录
    2019-4-25
    沙发
    2019-3-13 08:18:41 只看该作者
    666666666666666666666666666
    7日久生情
    1845/5000
    排名
    1193
    昨日变化

    0

    主题

    542

    帖子

    1845

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    87577
    好友
    0
    蛮牛币
    6535
    威望
    0
    注册时间
    2015-3-31
    在线时间
    325 小时
    最后登录
    2019-4-25
    板凳
    2019-3-13 08:48:09 只看该作者
    too good too strong!
    6蛮牛粉丝
    1017/1500
    排名
    2115
    昨日变化

    0

    主题

    202

    帖子

    1017

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    26073
    好友
    1
    蛮牛币
    3875
    威望
    0
    注册时间
    2014-5-21
    在线时间
    159 小时
    最后登录
    2019-4-25
    地板
    2019-3-13 08:55:32 只看该作者
    写的非常详细,辛苦楼主了。
    6蛮牛粉丝
    1105/1500
    排名
    2808
    昨日变化

    0

    主题

    269

    帖子

    1105

    积分

    Rank: 6Rank: 6Rank: 6

    UID
    2623
    好友
    0
    蛮牛币
    1964
    威望
    0
    注册时间
    2013-8-26
    在线时间
    314 小时
    最后登录
    2019-4-23
    5#
    2019-3-13 09:25:03 只看该作者
    5熟悉之中
    746/1000
    排名
    4111
    昨日变化

    1

    主题

    235

    帖子

    746

    积分

    Rank: 5Rank: 5

    UID
    245227
    好友
    0
    蛮牛币
    961
    威望
    0
    注册时间
    2017-9-21
    在线时间
    150 小时
    最后登录
    2019-4-25
    6#
    2019-3-13 09:50:06 只看该作者
    官方就不要整这些东西, 越搞越复杂
    7日久生情
    2295/5000
    排名
    2248
    昨日变化

    0

    主题

    1286

    帖子

    2295

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    189581
    好友
    0
    蛮牛币
    3447
    威望
    0
    注册时间
    2016-12-5
    在线时间
    383 小时
    最后登录
    2019-4-25
    7#
    2019-3-13 10:33:49 只看该作者
    可以的给力啊
    5熟悉之中
    748/1000
    排名
    3601
    昨日变化

    0

    主题

    96

    帖子

    748

    积分

    Rank: 5Rank: 5

    UID
    71644
    好友
    0
    蛮牛币
    1264
    威望
    0
    注册时间
    2015-1-28
    在线时间
    236 小时
    最后登录
    2019-4-25
    8#
    2019-3-13 10:50:51 只看该作者
    辛苦楼主了
    7日久生情
    1881/5000
    排名
    15584
    昨日变化

    4

    主题

    786

    帖子

    1881

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    63377
    好友
    0
    蛮牛币
    13
    威望
    0
    注册时间
    2014-12-24
    在线时间
    1044 小时
    最后登录
    2019-4-22
    9#
    2019-3-13 12:14:25 只看该作者
    666666666666666666
    7日久生情
    1640/5000
    排名
    4093
    昨日变化

    0

    主题

    990

    帖子

    1640

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    254705
    好友
    1
    蛮牛币
    1549
    威望
    0
    注册时间
    2017-11-16
    在线时间
    288 小时
    最后登录
    2019-4-25
    10#
    2019-3-14 08:20:44 只看该作者
    66666666666666666666666666666666
    5熟悉之中
    740/1000
    排名
    8914
    昨日变化

    0

    主题

    422

    帖子

    740

    积分

    Rank: 5Rank: 5

    UID
    36289
    好友
    0
    蛮牛币
    9
    威望
    0
    注册时间
    2014-7-25
    在线时间
    186 小时
    最后登录
    2019-4-18
    11#
    2019-3-14 08:47:37 只看该作者
    Prefab的一些梳理
    5熟悉之中
    877/1000
    排名
    3156
    昨日变化

    0

    主题

    201

    帖子

    877

    积分

    Rank: 5Rank: 5

    UID
    267103
    好友
    0
    蛮牛币
    2902
    威望
    0
    注册时间
    2018-1-31
    在线时间
    206 小时
    最后登录
    2019-4-25
    12#
    2019-3-14 09:02:30 只看该作者
    7日久生情
    2295/5000
    排名
    2248
    昨日变化

    0

    主题

    1286

    帖子

    2295

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    189581
    好友
    0
    蛮牛币
    3447
    威望
    0
    注册时间
    2016-12-5
    在线时间
    383 小时
    最后登录
    2019-4-25
    13#
    2019-3-14 09:15:59 只看该作者
    可以得给力啊
    7日久生情
    2373/5000
    排名
    1551
    昨日变化

    53

    主题

    824

    帖子

    2373

    积分

    Rank: 7Rank: 7Rank: 7Rank: 7

    UID
    219600
    好友
    7
    蛮牛币
    3271
    威望
    0
    注册时间
    2017-4-27
    在线时间
    674 小时
    最后登录
    2019-4-12
    14#
    2019-3-15 08:28:14 只看该作者
    感谢分享
    5熟悉之中
    608/1000
    排名
    10816
    昨日变化

    2

    主题

    411

    帖子

    608

    积分

    Rank: 5Rank: 5

    UID
    310426
    好友
    0
    蛮牛币
    492
    威望
    0
    注册时间
    2019-1-2
    在线时间
    99 小时
    最后登录
    2019-4-25
    15#
    2019-3-15 08:41:10 只看该作者
    Unity更新太快。。。
    您需要登录后才可以回帖 登录 | 注册帐号

    本版积分规则

  • 96次航拍峨眉 换个角度看巴蜀名山 中国国家地理网 2019-04-23
  • 俄罗斯电影《最后一球》定档落魄球星遇上菜鸟球队 2019-04-21
  • 【理上网来·辉煌十九大】缅甸资深媒体人高度评价习近平十九大报告:立意高远 内涵丰富 2019-04-21
  • 特朗普和金正恩先后抵达嘉佩乐酒店 会晤即将开始 2019-04-17
  • 中国侨联直属机关党委举办党务干部培训班 2019-04-17
  • 上海合作组织青岛峰会举行 2019-04-07
  • IT热点小度智能音箱发布 新飞电器破产拍卖 2019-04-04
  • 台州公务员管理再也不用“往返跑”了!“最多跑一次”撬动组织人事改革 全省首个试点 2019-04-03
  • 我要讨干嘛?姜太公钓鱼,愿者上钩。 2019-04-03
  • 新疆花开天山南北 笑迎八方来客 2019-03-25
  • 机器人占领就业市场后:人类还能从事这些工作 2019-03-04
  • 以网络文化建设推进文化惠民 2019-03-03
  • 贸易战,只能是双输。我们是众志成城,美国却不一定。 2019-02-26
  • 辣评2016年9月最HOT 轿车获奖榜单 2019-02-22
  • 交通运输部路网中心:端午假期高速通行不免费 2019-02-18