Unity VFX -- (4)創(chuàng)建burst粒子效果
? ? ? ? 如果用戶成功達成某個目標,我們可以使用一個爆裂的禮花來激勵用戶。如果角色揮舞刀劍,我們可以做出劍氣來增加氣勢。如果角色落到地面上,我們可以在腳部做出飛舞的灰塵來增加表現(xiàn)力。這些都可以視為burst粒子效果。
? ? ? ? 下面是一些burst粒子效果(burst particle)的例子,由于本人未能找到合適的翻譯,后面直接用burst particle英文原文寫。

武器射擊時槍口的火花效果

玩家到達終點時慶祝的閃爍的禮花效果

?用戶揮舞武器時的光影
? ? ? ? 這些基于事件的(event-based)粒子bursts,和前面所做的環(huán)境特效是不同的,它們是由具體事件所觸發(fā)的單次粒子的burst效果。
增加一個新的粒子burst
? ? ? ? 一個burst particle和enviromental particle是類似的,只是burst particle并不會持續(xù)很長時間,并且通常產(chǎn)生于一個較小的區(qū)域。我們先向場景中添加一個新的粒子系統(tǒng)。
? ? ? ? 1. Heirarchy中,點擊右鍵,選擇Effects -> Particle System,創(chuàng)建一個新的粒子系統(tǒng),重命名為"FX_SmokeBurst",然后我們將它的位置設(shè)置到X=0,Y=0.5,Z=0并將旋轉(zhuǎn)設(shè)置為X=-90,Y=0,Z=0(僅為案例中的位置,實際是放到火堆上,請根據(jù)實際情況移動和旋轉(zhuǎn))。

? ? ? ? 2.? FX_SmodeBurst的Particle System組件中,展開主模塊,去掉Looping屬性勾選。

?????????去掉勾選后,粒子會立即停止播放。在場景視圖中的Particle Effect窗口中點擊Play后,我們會注意到產(chǎn)生了一個5秒鐘的粒子效果,隨后停止。這是因為Duration屬性被設(shè)置為了5.目前看起來已經(jīng)有點burst particle的效果了。
? ? ? ? 為了創(chuàng)建出突發(fā)的粒子效果,我們將Duration降低為一個很小的值(比如0.05秒),并且將Rate over Time設(shè)置為一個很高的值(比如1000 particles每秒),這會在0.05秒內(nèi)產(chǎn)生50個粒子(1000 * 0.05 = 50)。

? ? ? ? 但目前看起來效果還是不理想,我們還需要對Bursts選項進行配置。
? ? ? ? 3. 在Emission模塊中,將Rate over Time設(shè)置為0,這樣會避免粒子系統(tǒng)隨著時間產(chǎn)生粒子。
? ? ? ? 4. 在Emission模塊中,點擊Bursts部分的“+”,添加一個新的burst。

?????????這個默認的burst配置,表示在第0秒的時候(Time),burst會產(chǎn)生30個粒子(Count)1次(Cycles),概率是100%(Probability)。Interval值目前沒有影響,因為我們只有一次burst cycle。
讓粒子像煙一樣運動
? ? ? ? 前面用了burst后,粒子運動地有點快。接下來我們來讓它們停留在火堆內(nèi)。
? ? ? ? 1. 在主模塊中,將Start Speed屬性降低到0.3秒。
? ? ? ? 2. 在主模塊中,將Start Lifetime降低到越1秒左右,這個值根據(jù)我們的需要調(diào)整。

? ? ? ? ?現(xiàn)在速度問題解決了,但煙看起來就像是從火堆底部外面產(chǎn)生的,我們需要修改一下發(fā)射器的形狀。
? ? ? ? 3. 在Shape模塊中,將Shape屬性從Cone改為Sphere,然后將Radius設(shè)置為大約0.5左右的值。

? ? ? ? 目前粒子的移動看起來比較對了,但由于所有粒子都按照相同的速度移動,并且同時消失,這看起來不太自然。我們需要在系統(tǒng)中加入一點隨機性來讓效果看起來更加真實。
給粒子加一點隨機性
?????????在粒子系統(tǒng)組件的Inspector中,我們可以看到許多屬性后面帶來一個小箭頭,點擊后會出現(xiàn)下拉菜單供我們選擇。這些下拉菜單提供了用于設(shè)置值的額外的選項,包括隨機化參數(shù)的能力。

? ? ? ? 為了避免粒子同時產(chǎn)生和消失,我們可以讓Start Lifetime變成隨機值。
? ? ? ? 1. 點擊Start Lifetime屬性的下拉菜單按鈕,選擇Random Between Two Constants

? ? ? ? 我們會注意到現(xiàn)在這個屬性有兩個值了,一個是最小值,一個是最大值。
? ? ? ? 2. 輸入Start Lifetime的最小值和最大值。比如如果原來的Start Lifetime是1,我們可以將其設(shè)置為0.5和1.5,或者0.25和3.0。這個值修改后可以根據(jù)實際效果進行調(diào)整。完成后,粒子系統(tǒng)中的每個粒子的生命周期會有所不同。
? ? ? ? 3. 我們還可以對Start Speed進行類似的操作,讓粒子系統(tǒng)中每個粒子的速度也隨機化。
使用漸變編輯器(Gradient editor)編輯Color over Lifetime
? ? ? ? ?為了修改讓粒子在其生命周期中能夠改變外觀,我們需要啟用一些新的模塊。
? ? ? ? 首先,這些粒子的產(chǎn)生和消失非常突兀,看起來很奇怪。我們可以加入一些淡入和淡出的效果。
? ? ? ? 1. 選擇并啟用Color over Lifetime模塊,然后展開它。

? ? ? ? 2. 在Color over Lifetime模塊里,選擇白色的矩形盒子,打開Gradient Editor窗口。

? ? ? ? 這個橫向的條表示了在粒子的生命周期中粒子的顏色和透明度是什么,生命周期從橫條的左側(cè)開始?,右側(cè)結(jié)束。因此,默認情況下,粒子在整個生命周期中是白色并且不透明的。我們可以使用Gradient Editor來調(diào)整粒子在其生命周期中的顏色和透明度,如下圖的藍色淡入,橙色淡出。

?????????顏色條上方的標記決定了不同時間的透明度,下方的標記決定了顏色變化。目前我們只需要讓我們的例子在開始時淡入,結(jié)束時淡出。
? ? ? ? 3. 要讓粒子有淡入效果,選擇左上角的標記,將Alpha值設(shè)置為0。

? ? ? ? 此時標記變成了黑色,表示顏色是完全透明的。
? ? ? ? 這時我們預(yù)覽一下例子實際的效果,會發(fā)現(xiàn)粒子在其生命周期中從完全透明到完全不透明。我們想要的效果是,在開始時例子快速淡入,結(jié)束時慢點淡出。我們調(diào)整一下箭頭標記。

? ? ? ? 4.??接下來使用漸變編輯器實現(xiàn)出自己的例子淡入淡出效果。要創(chuàng)建一個新的透明度標記,只需要在顏色條上方空白處選一下即可,要取消一個標記,將其向上或向下移動即可。

編輯Renderer和Texture Sheet Animation
? ? ? ? ?接下里我們將粒子的紋理做一下調(diào)整,現(xiàn)在我們不是簡單地用另一個單個紋理來替換默認的粒子紋理,而是使用texture sheet。
紋理表(texture sheets)是什么

?????????一張紋理表里有一些子圖,這些子圖可以被循環(huán)遍歷,實現(xiàn)動態(tài)動畫的效果(每張子圖類似于一個動畫的關(guān)鍵幀)。如上圖的煙霧效果,有四個子圖,循環(huán)遍歷它們會有煙霧形狀變化的效果。
? ? ? ? 我們可以使用紋理表來讓每一個粒子的動畫效果。

隨機化紋理表里的紋理
? ? ? ? 首先,我們需要將默認的粒子材質(zhì)修改為包含了紋理表的材質(zhì)。
? ? ? ? 1. 展開Renderer模塊,在Material屬性出,選擇SmodePuffMaterial的texture sheet。

? ? ? ? 此時如果在場景視圖中放大看煙霧,我們會發(fā)現(xiàn)現(xiàn)在每個粒子都顯示了整個texture sheet的圖案。

?????????為了解決這個問題,我們需要啟用Texture Sheet Animation模塊,這個模塊允許我們切割紋理表為子圖并能夠?qū)崿F(xiàn)動畫效果。
? ? ? ? 2. 啟用并展開Texture Sheet Animation模塊。我們會看到一個Tiles屬性,這個屬性定義了紋理表有多少行和列。
? ? ? ? 3. 在Texture Sheet Animation模塊中,將Tiles屬性設(shè)置為X=2, Y=2,這是因為我們所使用的紋理表有兩行兩列。
? ? ? ? 再次點擊播放,看看效果。

? ? ? ? ?我們可以看到,默認情況下Start Frame是0,Cycles是1.這表示每個粒子會走完一遍紋理表的四幀子圖(從第0幀開始)。雖然在某些場景下這樣已經(jīng)OK了,但對于煙霧來說看起來還是有點怪。因此,我們讓起始幀變得隨機化一點。
? ? ? ? 4. 將Start Frame修改為Random Between Two Constants,然后設(shè)置最小和最大值為0和3.這樣每個粒子會隨機選擇一幀作為起始幀。
? ? ? ? 5. 將Cycles設(shè)置為0,設(shè)置為0后,這個值會自動被改為0.0001,這不會影響結(jié)果。

? ? ? ? 預(yù)覽看看效果如何

使用曲線改變Size over Time
? ? ? ? 接下來我們讓粒子在出現(xiàn)時變大,消失時變小。
? ? ? ? 1. 啟用并展開Size over Lifetime模塊,在Size下拉菜單中選擇Curve。

? ? ? ? 2. 選擇Size屬性的曲線預(yù)覽方框。當選中時,里面的線會變成紅色。

? ? ? ? 3. 如果我們看不到Particle System Curve窗口,在Inspector的底部將其往上拖動即可。?

? ? ? ? 拖上來后,我們可以清楚地看到曲線圖形了。

? ? ? ? 這張圖的橫軸表示時間,縱軸表示大小

? ? ? ? 默認的曲線是一條直線,表示隨著時間增長,粒子會以線性方式逐漸增大。在time 0的時候,大小是0(粒子剛產(chǎn)生),在time 1的時候,大小是1,最大(粒子生命周期結(jié)束時)。?
調(diào)整曲線
? ? ? ? 現(xiàn)在我們了解了粒子系統(tǒng)曲線編輯器的布局了,接下來我們來編輯一下曲線,讓粒子的大小隨著時間增大和變小。
? ? ? ? 1. 首先可以嘗試一下粒子系統(tǒng)曲線編輯器底部的預(yù)設(shè)曲線,選擇其中的一種來看看效果。

? ? ? ? 我們想要的曲線應(yīng)該是一個倒U形的曲線(類似于向下開口的拋物線),可以知道這種曲線前段時間粒子會越變越大,后段時間會越變越小。預(yù)設(shè)曲線里并不存在,因此我們需要自定義。
? ? ? ? 2. 選擇下圖中的預(yù)設(shè)曲線作為初始曲線

? ? ? ? 3.??選擇并向下拖動右上角的紅色小圓圈(關(guān)鍵幀),讓曲線終點的Size變到很小或0


? ? ? ? 4. 選擇左下方的關(guān)鍵幀,我們會看到原點旁邊有一個條線,線有一個端點用來調(diào)節(jié)。



?????????現(xiàn)在再來看看效果,如果對于效果不滿意,我們就繼續(xù)調(diào)整粒子系統(tǒng)的相關(guān)模塊參數(shù)。詳細的粒子系統(tǒng)模塊的信息,可以參考Unity官方文檔:
????????
? ? ? ? 對于制作好的煙霧特效,如果要復(fù)用,可以將其制作成預(yù)制體。
觸發(fā)動畫
? ? ? ? 接下來我們用腳本來檢測按鍵并完成點火和熄滅火堆的效果,同時帶上煙霧效果。
? ? ? ? 1. 在火堆的粒子系統(tǒng)的主模塊中,確保Play on Awake被勾選,這個選項能保證火焰粒子效果能在它被添加到場景的時候自動播放。
? ? ? ? 2. 在煙霧粒子效果的主模塊中,確保Play on Awake被禁用(不要勾選)。我們要用腳本來觸發(fā)這個特效的播放時機。
? ? ? ? 做完上面兩步后,可以看到火焰會保持燃燒,沒有煙霧效果。
? ? ? ? 3. 在項目窗口中,將CreativeCore_VFX->Scripts目錄里的ToggleFireParticle腳本拖到Fire_ParticleSystem_Prefab物體上作為其組件。
? ? ? ? 4. 在Fire_ParticleSystem_Prefab的Inspector中,拖動對應(yīng)的Point Light(prefab的子物體),煙霧特效游戲物體到腳本的屬性中。

? ? ? ? 點擊運行場景,按空格鍵可以實現(xiàn)點火和熄滅的效果。