香港6合总彩透码主论坛
 ?#19968;?#23494;码
 注册帐号

扫一扫,访问微社区

士郎 新版Prefab的一些梳理

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

8061

主题

8619

帖子

3万

积分

Rank: 16

UID
1231
好友
186
蛮牛币
12260
威望
30
注册时间
2013-7-29
在线时间
4127 小时
最后登录
2019-8-23

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

马?#29486;?#20876;,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐?#29275;?a href="member.php?mod=register" title="注册帐号">注册帐号

x


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

?#20154;?#19979;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为后?#22909;?#21517;的。

如何编缉Prefab?
有多种方式可以对Prefab进行编缉,这里编缉的意思是指对Prefab本身做修?#27169;?#20197;使修改自动更新到所有的实例?#23567;?/font>

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

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



Prefab
Prefab Mode

要在Prefab Mode中编缉,首先就要进入到此模式下,有以下几种进入方式:
  • 在Hierarchy面板中,Prefab对象的最?#20063;?#26377;个向右的小箭头,通过点击?#24605;?#22836;即可进入Prefab Mode?#23567;?/font>



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


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





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



从Project进入Prefab Mode

进入后呈现如下所示:


Prefab Mode

  • 一级一级的退出Prefab Mode,每点一次回退一级。
  • 点击标签可以回退到指定的上一级,多级嵌?#36164;?#21487;以方便的回到某个层级?#23567;?/font>
  • Auto Save,自动保存,默认勾选,在Prefab Mode中所做的任何修改都会自动进行保存。如果电脑?#38405;?#19981;佳,有出现卡顿感时,可以选择去掉勾选,在需要时主动点击Save按钮(当去掉勾选时,在其左边会出现Save按钮)。另外,当去掉勾选,同?#24065;?#20570;了一些修?#27169;?#20294;是在没有点Save后,直接选择退出Prefab Mode,此时会弹出一个提示对话框,需要选择是否对修改进行保存。还是相当贴心的。



Editing Environment
编缉环境,什么意思呢,就是说当我们进入Prefab Mode时,默?#40092;?#29992;的都是一个只有天空盒的空场景,那如果我们想要换个场景怎么办呢?
通过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的实例,然后再拖进来一个,移动一下它的位置,?#38142;耍?#25105;们在场景中有了两个Robot的实例。


大部分情况下,我?#23884;?#24076;望生成出来的实例是有些稍稍不同的,比如某个Robot大一点,某个Robot又高一些,甚至某些Robot有些额外的部件等等。
总体而?#38405;兀?#20250;有以下几种类型的不同:
  • 属性值的不同
  • 组件的新增与?#22659;?/font>
  • ?#28216;?#20307;的添加



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

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

Prefab实例修改后的标记


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

  • Overrides(覆盖)

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

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

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

  • Open?#33322;?#20837;Prefab Mode
  • Select:在Project面板中选中此Prefab
  • Overrides:覆盖或者恢复实例上的修改

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



实例上的基本操作



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



注意Scale值会被收集到Overrides?#23567;?/font>

当实例上产生?#31579;?#30422;的修改时,面板将显示如下:



  • Revert All:恢复实例的所有修改到Prefab原始状态,也就是移除所有修?#27169;?#22238;复到默?#29486;?#24577;。
  • Apply All?#33322;?#27492;实例上的所有修改都覆盖到Prefab本身,此操作会影响到所有的实例。
  • 当一个实例有修改时,会在此处列出每个修改块,通过点击可查看具体的修改信息。
  • 查看每个修改块的具体修?#21738;?#23481;,如果是新增的就会单独以Added的?#38382;?#23637;示,如果是原先Prefab就有的,则会显示出两者的?#21592;齲?#20415;于参照,可以说是非常?#22841;?#20102;。同时在此小面板的右上角有Revert和Apply两个按钮,与1、2大同小异,只不过是单独针对选中的对象进行操作的。


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

在Component上覆盖与恢复Prefab





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

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



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



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



嵌套Prefab
新版中最重要的功能就是支持嵌套了,实?#20160;?#20316;起来也是非常简单,重要的一些概念在上面?#23478;?#32463;讨论过了。
如下图中,我们将Robot的各个部件都单?#37070;?#25104;一个Prefab并且放置于Robot内,这就形成了嵌套Prefab。
Prefab中的嵌套Prefab





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


同?#24065;?#25903;持多级嵌套,即Prefab中有子Prefab,子Prefab中又可有自己的子Prefab。。。?#28304;?#31867;推,具体不清楚有没有嵌套层级数量限制,理论上来讲应该是无限的。



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

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

按?#25214;?#21069;的做法,我?#24378;?#23450;是生成多个Prefab,各个Prefab不相关,不同的外观不同的属性,一旦想改变所有的属性?#26412;?#24517;须要去一个个的修?#27169;?#36825;是及其不方便的。


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



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


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


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


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



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

变体与本本




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

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




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


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


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


运行时保存代码



工具界面最终如下:

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

知乎@taecg



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

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

回复

使用道具 举报

排名
4092
昨日变化

0

主题

1406

帖子

2132

积分

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

UID
254705
好友
1
蛮牛币
1933
威望
0
注册时间
2017-11-16
在线时间
364 小时
最后登录
2019-8-24
沙发
2019-3-13 08:18:41 只看该作者
666666666666666666666666666
回复 支持 反对

使用道具 举报

排名
1192
昨日变化

1

主题

559

帖子

1919

积分

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

UID
87577
好友
0
蛮牛币
8087
威望
0
注册时间
2015-3-31
在线时间
381 小时
最后登录
2019-8-24
板凳
2019-3-13 08:48:09 只看该作者
too good too strong!
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1160/1500
排名
2066
昨日变化

0

主题

262

帖子

1160

积分

Rank: 6Rank: 6Rank: 6

UID
26073
好友
1
蛮牛币
4413
威望
0
注册时间
2014-5-21
在线时间
230 小时
最后登录
2019-8-23
地板
2019-3-13 08:55:32 只看该作者
写的非常详细,?#37327;?#27004;主了。
回复 支持 反对

使用道具 举报

6蛮牛粉丝
1125/1500
排名
2807
昨日变化

0

主题

272

帖子

1125

积分

Rank: 6Rank: 6Rank: 6

UID
2623
好友
0
蛮牛币
2000
威望
0
注册时间
2013-8-26
在线时间
331 小时
最后登录
2019-7-18
5#
2019-3-13 09:25:03 只看该作者
回复

使用道具 举报

5熟悉之中
803/1000
排名
4110
昨日变化

1

主题

271

帖子

803

积分

Rank: 5Rank: 5

UID
245227
好友
0
蛮牛币
987
威望
0
注册时间
2017-9-21
在线时间
172 小时
最后登录
2019-8-23
6#
2019-3-13 09:50:06 只看该作者
官方就不要整这些东西, 越搞越复杂
回复 支持 反对

使用道具 举报

排名
2248
昨日变化

0

主题

1285

帖子

2319

积分

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

UID
189581
好友
0
蛮牛币
3635
威望
0
注册时间
2016-12-5
在线时间
408 小时
最后登录
2019-8-23
7#
2019-3-13 10:33:49 只看该作者
可以的给力啊
回复

使用道具 举报

5熟悉之中
827/1000
排名
3600
昨日变化

0

主题

102

帖子

827

积分

Rank: 5Rank: 5

UID
71644
好友
0
蛮牛币
1602
威望
0
注册时间
2015-1-28
在线时间
309 小时
最后登录
2019-8-24
8#
2019-3-13 10:50:51 只看该作者
?#37327;?#27004;主了
回复

使用道具 举报

排名
15587
昨日变化

4

主题

787

帖子

2022

积分

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

UID
63377
好友
0
蛮牛币
42
威望
0
注册时间
2014-12-24
在线时间
1183 小时
最后登录
2019-8-25
9#
2019-3-13 12:14:25 只看该作者
666666666666666666
回复 支持 反对

使用道具 举报

排名
4092
昨日变化

0

主题

1406

帖子

2132

积分

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

UID
254705
好友
1
蛮牛币
1933
威望
0
注册时间
2017-11-16
在线时间
364 小时
最后登录
2019-8-24
10#
2019-3-14 08:20:44 只看该作者
66666666666666666666666666666666
回复 支持 反对

使用道具 举报

5熟悉之中
786/1000
排名
8916
昨日变化

0

主题

432

帖子

786

积分

Rank: 5Rank: 5

UID
36289
好友
0
蛮牛币
50
威望
0
注册时间
2014-7-25
在线时间
222 小时
最后登录
2019-8-25
11#
2019-3-14 08:47:37 只看该作者
Prefab的一些梳理
回复 支持 反对

使用道具 举报

5熟悉之中
923/1000
排名
3155
昨日变化

0

主题

206

帖子

923

积分

Rank: 5Rank: 5

UID
267103
好友
0
蛮牛币
3534
威望
0
注册时间
2018-1-31
在线时间
247 小时
最后登录
2019-8-24
12#
2019-3-14 09:02:30 只看该作者
回复

使用道具 举报

排名
2248
昨日变化

0

主题

1285

帖子

2319

积分

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

UID
189581
好友
0
蛮牛币
3635
威望
0
注册时间
2016-12-5
在线时间
408 小时
最后登录
2019-8-23
13#
2019-3-14 09:15:59 只看该作者
可以得给力啊
回复

使用道具 举报

排名
1542
昨日变化

53

主题

829

帖子

2398

积分

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

UID
219600
好友
7
蛮牛币
3329
威望
0
注册时间
2017-4-27
在线时间
690 小时
最后登录
2019-7-19
14#
2019-3-15 08:28:14 只看该作者
?#34892;?#20998;享
回复

使用道具 举报

6蛮牛粉丝
1113/1500
排名
10818
昨日变化

3

主题

838

帖子

1113

积分

Rank: 6Rank: 6Rank: 6

UID
310426
好友
0
蛮牛币
1499
威望
0
注册时间
2019-1-2
在线时间
176 小时
最后登录
2019-8-23
15#
2019-3-15 08:41:10 只看该作者
Unity更新太快。。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

香港6合总彩透码主论坛
重庆时时开奖结果记录官 幸运飞艇计划滚雪球 重庆时时龙虎合技巧 定位胆8码倍投表 双色球走势图带连线图 网络扎金花的规律 看牌神器 扎金花 北京pk赛车龙虎技巧论坛 北京pk拾赛车高手论坛 计算数字大小单双的软件下载