香港6合总彩透码主论坛
 找回密碼
 注冊帳號

掃一掃,訪問微社區

士郎 新版Prefab的一些梳理

29
回復
5640
查看
打印 上一主題 下一主題
[ 復制鏈接 ]
9以壇為家
33301/50000
排名
1
昨日變化

8252

主題

8810

帖子

3萬

積分

Rank: 9Rank: 9Rank: 9

UID
1231
好友
186
蠻牛幣
701
威望
30
注冊時間
2013-7-29
在線時間
4217 小時
最后登錄
2019-11-20

活力之星原創精華達人突出貢獻獎財富之證游戲蠻牛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日久生情
2683/5000
排名
4094
昨日變化

0

主題

1880

帖子

2683

積分

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

UID
254705
好友
1
蠻牛幣
2408
威望
0
注冊時間
2017-11-16
在線時間
441 小時
最后登錄
2020-2-24
沙發
2019-3-13 08:18:41 只看該作者
666666666666666666666666666
回復 支持 反對

使用道具 舉報

7日久生情
2005/5000
排名
1192
昨日變化

1

主題

578

帖子

2005

積分

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

UID
87577
好友
0
蠻牛幣
9251
威望
0
注冊時間
2015-3-31
在線時間
446 小時
最后登錄
2020-1-20
板凳
2019-3-13 08:48:09 只看該作者
too good too strong!
回復 支持 反對

使用道具 舉報

6蠻牛粉絲
1223/1500
排名
2066
昨日變化

0

主題

273

帖子

1223

積分

Rank: 6Rank: 6Rank: 6

UID
26073
好友
1
蠻牛幣
4871
威望
0
注冊時間
2014-5-21
在線時間
282 小時
最后登錄
2020-1-17
地板
2019-3-13 08:55:32 只看該作者
寫的非常詳細,辛苦樓主了。
回復 支持 反對

使用道具 舉報

6蠻牛粉絲
1131/1500
排名
2807
昨日變化

0

主題

272

帖子

1131

積分

Rank: 6Rank: 6Rank: 6

UID
2623
好友
0
蠻牛幣
2011
威望
0
注冊時間
2013-8-26
在線時間
337 小時
最后登錄
2020-1-20
5#
2019-3-13 09:25:03 只看該作者
回復

使用道具 舉報

5熟悉之中
886/1000
排名
4112
昨日變化

1

主題

321

帖子

886

積分

Rank: 5Rank: 5

UID
245227
好友
0
蠻牛幣
1081
威望
0
注冊時間
2017-9-21
在線時間
203 小時
最后登錄
2019-12-24
6#
2019-3-13 09:50:06 只看該作者
官方就不要整這些東西, 越搞越復雜
回復 支持 反對

使用道具 舉報

7日久生情
2357/5000
排名
2248
昨日變化

0

主題

1284

帖子

2357

積分

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

UID
189581
好友
0
蠻牛幣
3922
威望
0
注冊時間
2016-12-5
在線時間
447 小時
最后登錄
2020-2-25
7#
2019-3-13 10:33:49 只看該作者
可以的給力啊
回復

使用道具 舉報

5熟悉之中
878/1000
排名
3601
昨日變化

0

主題

104

帖子

878

積分

Rank: 5Rank: 5

UID
71644
好友
0
蠻牛幣
1856
威望
0
注冊時間
2015-1-28
在線時間
358 小時
最后登錄
2020-2-26
8#
2019-3-13 10:50:51 只看該作者
辛苦樓主了
回復

使用道具 舉報

7日久生情
2093/5000
排名
15588
昨日變化

4

主題

787

帖子

2093

積分

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

UID
63377
好友
0
蠻牛幣
63
威望
0
注冊時間
2014-12-24
在線時間
1254 小時
最后登錄
2020-1-29
9#
2019-3-13 12:14:25 只看該作者
666666666666666666
回復 支持 反對

使用道具 舉報

7日久生情
2683/5000
排名
4094
昨日變化

0

主題

1880

帖子

2683

積分

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

UID
254705
好友
1
蠻牛幣
2408
威望
0
注冊時間
2017-11-16
在線時間
441 小時
最后登錄
2020-2-24
10#
2019-3-14 08:20:44 只看該作者
66666666666666666666666666666666
回復 支持 反對

使用道具 舉報

5熟悉之中
821/1000
排名
8917
昨日變化

0

主題

439

帖子

821

積分

Rank: 5Rank: 5

UID
36289
好友
0
蠻牛幣
157
威望
0
注冊時間
2014-7-25
在線時間
250 小時
最后登錄
2020-2-13
11#
2019-3-14 08:47:37 只看該作者
Prefab的一些梳理
回復 支持 反對

使用道具 舉報

5熟悉之中
985/1000
排名
3156
昨日變化

0

主題

229

帖子

985

積分

Rank: 5Rank: 5

UID
267103
好友
0
蠻牛幣
4399
威望
0
注冊時間
2018-1-31
在線時間
286 小時
最后登錄
2020-2-12
12#
2019-3-14 09:02:30 只看該作者
回復

使用道具 舉報

7日久生情
2357/5000
排名
2248
昨日變化

0

主題

1284

帖子

2357

積分

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

UID
189581
好友
0
蠻牛幣
3922
威望
0
注冊時間
2016-12-5
在線時間
447 小時
最后登錄
2020-2-25
13#
2019-3-14 09:15:59 只看該作者
可以得給力啊
回復

使用道具 舉報

7日久生情
2485/5000
排名
1542
昨日變化

58

主題

854

帖子

2485

積分

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

UID
219600
好友
7
蠻牛幣
3085
威望
0
注冊時間
2017-4-27
在線時間
747 小時
最后登錄
2019-12-20
14#
2019-3-15 08:28:14 只看該作者
感謝分享
回復

使用道具 舉報

7日久生情
1723/5000
排名
10820
昨日變化

3

主題

1367

帖子

1723

積分

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

UID
310426
好友
0
蠻牛幣
2653
威望
0
注冊時間
2019-1-2
在線時間
257 小時
最后登錄
2020-2-21
15#
2019-3-15 08:41:10 只看該作者
Unity更新太快。。。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 注冊帳號

本版積分規則

香港6合总彩透码主论坛
老虎配资 成都期货配资 期货配资玩法 股票涨跌颜色怎么看 美欣达鲍凤娇身价多少 今天股票行情指数 捷捷盈配资 股票涨跌颜色消失了怎么办 股票融资融劵是什么意思 2018中国十大线上配资平台