Unity3d-Particle System系統的學習(一)
最近看了下Unity3d的粒子系統的相關視頻,並且動手操作了下,感覺自己的美工技能又增進了下(開個小玩笑),發現粒子系統所需要記憶的東西還是有點多的。
所以爲了不讓自己遺忘某些知識點,我準備發佈成博客,以便以後能夠查閱回憶。
OK,廢話不多說,馬上進入Particle System,相對程序員來說的噩夢:
我們先來看看Particle System在Inspector視窗中的屬性:
可見,粒子總共有個Transform組件和Particle System組件。
1.Transform:可以控制粒子在世界或者本地座標的改變。但是有點注意的是,如果你改變Scale屬性值是不會影響粒子的大小縮放的。所以我們想改變粒子大小不能這麼改。
2.Particle System:改變粒子的屬性,比如大小,發射速度等等。這個也是我們製作粒子的核心組件。
OK,來看看這些屬性值的作用。
我們先在Scene中創建一個新的Particle System,然後到Inspector視窗中。
1.我們先來學下他的基本屬性:
(1)Duration:粒子持續的時間,什麼意思?就是你發射器發送粒子持續的時間。可能還有些繞,舉個例子,比如你打火機打開,點個煙。從打開到熄滅火這個過程火焰持續在燃燒,那麼這個時間段就是Duration。再舉個例子,你煤氣在燒兩壺水,一個燒水10分鐘,一個燒水5分鐘。那麼煤氣竈是粒子發射器,火焰是粒子,10分鐘和5分鐘就是持續時間。
我們做個小實驗,我們把loop勾去掉,因爲這個會影響Duration,如果是loop循環發射那麼Duration就爲無窮大,沒有意義。把Duration改成5和1分別試下。
5秒:
可以看到5秒之後呢,粒子就不再發射了。
1:
可以看到1秒之後,粒子就不再發射。
(2)Looping:循環發射粒子。我們打鉤之後,粒子發射器就會不斷的持續的發射粒子,不管你的Duration調成多少,他都是一成不變的管自己發射。
(3)Prewarm:預熱粒子發射。什麼意思,當我們開始發射粒子的時候,是不是粒子數量從0開始,然後才慢慢增多,可看到上面額gif。但是當我們勾選這個,他就會在我們點擊發射的時候,他不是從數量0開始,而是像已經發射一個週期一樣。(注意他只是在Looping打鉤的情況下才能使用)
可以看到我一點發射,他數量就已經是發送一個週期的數量。
(4)Start Delay:延遲多長時間開始發射粒子。也就是說我們點擊開始發射,他會暫停這麼多時間後,然後纔開始發射粒子。
(5)Start Lifetime:開始粒子的生命週期。這個值就是單個粒子的生命週期。就像我們人類的壽命一樣,比如有個人的壽命80,過了80年,他就從世界上消失了。那麼如果一個粒子的開始生命週期是5秒,那麼這個粒子發射到Unity3d的World中,過了5秒之後,這個粒子就消亡了,道理是一樣的。
那麼我們想讓不同的粒子有着不同的生命週期,那麼怎麼弄?放心,在unity中我們生命週期的值是可以設置隨機不同的值。具體看下Inspector視窗中的屬性:
可以看到他支持4中不同類型的值:
(1.Constant:常量。也就是每個生命週期都一樣。
(2.Curve:曲線。
舉個例子,假如我Duration是3秒,生命週期鑰匙曲線值,那麼我弄得曲線是如圖。
那麼這個曲線是什麼意思呢,縱座標表示生命週期的值,橫座標表示Duration的值。
假如我們在點(0.5,4)做文章,也就是說在一個粒子在粒子發射器已經持續發射0.5秒後發射出來,那麼他對應的生命週期就是是4秒,所以越往後面發射生命週期越小,消亡越快。
(3.Random Between Two Constants:隨機在兩個常量之間。也就說粒子生命週期定在這兩個常量中間。比如我定的兩個常量是1,10。那麼粒子生命週期可能是1,可能是3,可能是10,反正不會超過或者小於兩個值。
(4.Randow Between Two Curves:隨機在兩條曲線之間。
這個也是類似的,但是取值就是兩條曲線之間的取值,比如我在圖中已經畫出了一條直線,如果Duration剛好是圖中直線的x座標值,那麼這條直線和兩條曲線相交的兩個值,那麼這個生命週期就會隨機從這兩個中取一個。
OK,終於講完了取值。接着我們看。
(6)Start Speed:開始速度。粒子出生具有的速度,這個值也是可以有4中類型的,因爲有些粒子速度快點,有些慢點。
(7)Start Size:開始大小。粒子出生具有的大小。跟速度一樣,也是4種類型的。
(8)Start Rotation:開始旋轉方向。粒子出生具有的旋轉方向。也是4種類型的值。
(9)Start Color:開始顏色值。粒子出生具有的顏色。
在第二種我這裏講下,這個是顏色漸變值,什麼意思?當我們選擇Gradient漸變的模式時:
會出現這編輯器,那麼怎麼製作呢?很簡單,我們只要在空白雙擊就會出現指標,然後不同的指標改變不同的顏色,那麼怎麼會有上下浮標。
這裏上面是Alpha的值,下面是Color的值。
修改完顏色之後,我們來看看效果。
可以看到顏色先是紅色,再是紫色,然後藍色,最後白色,是不是我們上面調的顏色順序,也就是說他是根據Duration然後改變不同的顏色。
(9)Gravity Multiplier:受重力影響的值。也就是說這個值越大,那麼受到重力越大。我們做個小實驗,我們修改Start Speed大一點,爲10,然後修改這個值爲2。發射粒子:
可以看到發射出去的粒子都受到重力影響往下落。
(10)Inherit Velocity:繼承速度。也就是說這個值是影響粒子受到發射器速度的影響。一般來說我們這個值是設爲0.這裏參數我們不管,因爲我也不怎麼懂。=_=!
(11)Simulation Space:發射座標。什麼意思?這裏有兩個參數可供選擇。第一個是Local(默認),第二個是World,這兩個有什麼區別呢?
區別還是蠻大的,首先我們知道粒子是從粒子發射器裏面發射出來的,但是粒子發射出來後是屬於粒子發射器還是世界的?這裏如果是Local的話,也就是說粒子還是屬於本地粒子發射器的,粒子發射出來後,粒子發射器在哪裏粒子就在哪裏。
但是World就截然不同,它表示發射出來的粒子是屬於世界的,已經不是屬於粒子發射器的,所以當你移動粒子發射器,已經發射的粒子還是留在原地。
我們來看下實驗結果:
(12)PlayOnAwake:是否在激活就播放。
(13)Max Particles:最多粒子數。就是一個duration內發射粒子最多數量。如果是1的話,一個duration只發射1.
OK,講完基礎屬性,我們接着講各個比較重要的屬性:
發射器相關的屬性,可以看到第一個屬性Rate:
1.Rate:每秒發射多少粒子(簡稱發射速率)。什麼意思,比如你的Duration是5秒,Max Particles是50的話,你Rate爲10,那麼就是每秒發射10個粒子,5秒就發射50個。但是現在如果把Rate改成50的話,那麼一秒一次性發射50個粒子,也就是說把所有的發射完了,那麼就下來的4秒就沒有粒子可以發射了。
2.Bursts:粒子集。可以看到粒子集右邊有個+號的按鈕,我們點擊就會出現Time和Particles的參數選擇。
那麼這兩個參數是幹嘛用的,其實就是在0.00時刻,發射30個粒子,結合上圖顯示的參數。
我們還可以點擊+號繼續添加不同時刻發射不同數量的粒子。比如我繼續添加在4.00時刻發射30粒子。
這裏注意下,這個Time時刻是不能超過Duration持續時間,不然的話是沒有效果的,還有發射粒子的總數和不能超過Max Particles,不然的話發射總數還是Max Particles,只不過超過的部分自動被截斷了。還有得吧Rate改成0,因爲沒有速率可言。
然後觀察下效果:
可以看到在0.00時刻發射30個,在4.00時刻發射20,爲什麼因爲Max Particles才50,面前已經30,所以最後50-30=20個。
Unity3d-Particle System系統的學習(二)
這節我們繼續上節沒講完的Particle參數。
上節我們講了Emission發射器參數,我們接着往下講Shape:
可以看到這個子模塊的參數是跟形狀有關:
1.Shape:發射形狀。粒子被約束在這個形狀中發射。我們看看效果圖就知道了。就拿這個Cone錐形來看:
可以看見粒子發射總是被約束在這個錐形中。
我們看看總共有幾種形狀:
1.Sphere:球體。粒子被約束在這個球體中發射。
(1.Radius。球體半徑。
(2.Emit from Shell:是否粒子發射是在圓形的表面發射。默認是圓形體內任意位置。
(3.Random Direction:是否是隨機方向。默認是跟形狀相關的從中心向外發散方向,比如球體就是爆炸方向。如果是隨機方向的話,就是胡亂發射。但是他還是被約束在球體裏面發射。只不過發射的方向變了而已。
2.HemiSphere:半球體。粒子被約束在這個半球體內發射。
(1.Radius:半球體的半徑。
(2.Emit from Shell:是否粒子發射是在半球體的表面發射。默認是半球體內任意位置。
(3.Random Direction:跟球體類似。本來是從球體中心發散出去,但是勾選這個之後,就隨機方向發射。
3.Cone:椎體。粒子被約束在這個椎體中發射出去。
(1.Angle:錐形斜面和垂直方向的夾角。如0度就是圓柱。90度就是跟平面類似。
(2.Radius:錐形底面的半徑。
(3.Length:底面和頂面的距離。也就是圓錐的高。這個參數是受第4個參數的影響,如果是從Base(底面)發射,那麼Length就沒有用。如果是Volume(體積)發射,那麼Length就有用。因爲體積肯定和高度有關嘛。
(4.Emit form:從哪裏發射:總共有4種:
1.Base:圓錐底面。粒子是從圓錐體的底面的任意位置沿着體積方向發射出去。
2.BaseShell:圓錐底面周長邊。粒子是從圓錐底面的周長邊沿着側表面的方向發射。與Base唯一的區別就是一個是沿體積,一個是沿側面。
3.Volume:體積。粒子是從圓錐體內的任意位置沿着體積的方向發射出去。
4.VolumeShell:體積側面。粒子是從圓錐體的側面的任意位置沿着側面方向發射出去的。
(5.Random Direction:與上面講的隨機類似。
4.Box:長方體。粒子被約束在長方體內發射。
(1.Box X:x方向上的長度。
(2.Box Y: y方向上的長度。
(3.Box Z:z方向上的長度。
默認發射粒子是在長方體內的任意位置沿着z方向(與xy平面垂直)發射。
(4.Random Direction:類似不講了。
5.Mesh:網格。粒子被約束在網格里面發射。
可以看到我這裏選擇了一個Plane網格,那麼上面的參數Triangle是什麼鬼。這個參數是表示粒子在哪裏反射。總所周知,網格由頂點,線段,面構成。那麼Triangle代表是三角面。
他這裏有三個選擇:
1.Vertex:粒子就是從網格的頂點發射出去。
2.Edge:粒子是從網格的邊長髮射出去。
3.Triangle:粒子從網格的面發射出去。
OK,經過長篇大幅,終於把Shape這個組件講完了。我們來總結下這個Shape的作用,他主要是約束粒子發射的形狀,比如火焰當然得用Cone錐形,然後夜明珠就得用Sphere球體。
行,我們講下個組件:Velocity over Lifetime 速度受粒子的生命週期影響。
假如說我們將x改成4,那麼粒子在x方向的速度是4,那麼在粒子的生命週期內,他的x方向速度是4,其他方向速度是0。也就是說他會偏向x方向移動。
同理,y和z方向也是類似的。
那麼下面的Space是什麼,就是這個x方向的速度是受父類速度影響(Local)還是不受父類影響(World)。我具體研究了下,發現根本沒啥屌用。主要還是看前面的Simulation Space的參數。所以這個參數我們暫時不管他。
我們總結下,這個組件有啥用,主要是根據不同類型粒子改變不同方向上的速度。如下雨,肯定不是直直的下着帶有點傾斜的下着,所以這裏改變下方向速度就可以實現。
OK,我們繼續下個組件:Limit Velocity over Lifetime 限制粒子速度
這個組件其實沒啥屌用,就是限制粒子發射速度。
(1.Separate Axis:是否限制3個方向的速度。當我們打鉤之後,會有x,y,z三個方向的速度限制。
(2.Speed:總體限制的速度。
(3.Dampen:速度限制倍數。我發現永遠爲1,不懂爲什麼。
OK,這個組件其實就是爲了防止在其他地方修改導致粒子速度過快或者過慢。
進入下個組件:Force over Lifetime 粒子在不同方向受力
這個組件其實就是改變粒子不同方向上的加速度。感覺類似於上面講的兩個組件,這裏我不詳細介紹。
主要應用場景很多,比如噴泉,我們在z方向施加往下的力,類似的場景很多,凡是跟重力相關的都可以用上。
Color over Lifetime:(粒子顏色隨着生命週期的改變而改變)
這個組件是用來改變粒子顏色,但是這個顏色變化是根據粒子的生命週期而變化的,如下如所示:
我在生命中期的顏色改爲紅色,可見粒子發射出來的時候在中間位置顏色變成紅色。
Color by Speed:(粒子顏色隨着速度的變化而變化)
這個組件也是用來改變粒子顏色的,只不過這次是根據粒子的實時速度來變化的。
見下圖:
粒子的速度爲5,
1.Color:我選擇在速度範圍的中間設置爲紅色。
2.Speed Range:速度範圍。這裏我選擇0-10,那麼粒子的速度落在了範圍的中部,所以整體粒子的顏色改變爲紅色。
Ok,接下來幾個組件與上面幾乎一致,分別是:
1.Size over Lifetime:(粒子大小隨着生命週期而變化)
2.Size by Speed(粒子大小隨着速度而變化)
3.Rotation over Lifetime(粒子旋轉方向隨着生命週期而變化)
4.Rotation by Speed(粒子旋轉方向隨着速度而變化)
External Forces:(這個組價我一直搞不懂,但是幾乎沒怎麼用到,先跳過等我研究透了再來寫)
接下來:
Collision:(粒子碰撞效果)
這個組件用來處理粒子與其他碰撞器之間的碰撞檢測。
1.Planes Or World(第一個參數是其他碰撞體類型,
(1-Planes)如果是Planes的話,那麼規定死了,粒子只能與這些Planes,也就是面碰撞,如上圖,我們可以點擊+按鈕添加Transform面)
(2-Visualization)可視化類型,有分Grid和Solid:
Grid:(網格,在編輯過程中可以看見具體的碰撞器邊界)
Solid(實體),沒有邊界,但是他的實體就是邊界,沒啥差別。
(3-Scale Plane)面的縮放大小,也就是碰撞器的縮放大小。
(4-Dampen)碰撞器表面的摩擦力大小。如果大於0的話,表明粒子碰到碰撞器後速度會減少。
(5-Bounce)彈力。默認爲1,如果爲0的話,表示不能反彈,那麼就只能沿着碰撞器表面滑行。
(6-Lifetime Loss)碰撞之後粒子生命週期減少。
(7-Min Kill Speed)顧名思義。粒子碰撞後如果速度小於這個速度的粒子會銷燬。
(8-Particle Radius)粒子半徑。
(1-World)如果是World的話,我們可以選擇在世界座標下所有的碰撞的layer來剔除。在參數中多了個Collides With,這裏選擇我們需要的layer。
其他大致參數與上述Planes一致。
Sub Emitters:(自粒子發射器)
分爲三個階段:
1.Birth(本粒子出生的時候,那麼子粒子會跟着本粒子出生)
2.Collision(本粒子碰撞的時候,會產生子粒子)
3.Death(本粒子死亡的時候,會產生子粒子)
這裏注意所謂粒子是單個粒子,不是整個Particle System。可能讀者會誤以爲整個本體Particle死亡的時候才產生粒子,這裏是個誤區,其實是Particle的單個小粒子。
比如我在出生的搞個子粒子。那麼每發射一個小粒子,會持續產生子粒子,注意持續。因爲我沒有在本體粒子Death處理任何事,也就是說本體粒子沒有消亡之前,一直會產生子粒子。
接下來:
Texture Sheet Animation:(序列幀動畫)
這個組件得配合下面的Renderer組件的材質球。因爲我們的序列幀圖片是從這裏獲取的。
這裏我搞了個幀貼圖材質,賦給Renderer組件裏面的Material。
OK,我們看下Texture Sheet Animation的參數:
1.Tiles :(這裏是UV座標,其實可以理解爲xy分別表示把整張圖切成幾塊,比如x等1,y等2,表示整張圖,x部分整張,y部分被切成兩塊,這樣就表示整張圖被切成上下兩個部分,這樣幀動畫就拿着兩個部分循環替換出現,如果x等2,y等2,那麼就整張圖被切成四塊,幀動畫取四塊交替)
2.Animation:(表示去哪個部分做幀動畫)
(1-Whole Sheet:表示整張圖,根據上面的UV)
(2-Single Row:單行)比如x=2,y=2就表示兩行,row=0,就交替第一行的圖片,row=1,就交替第二行的圖片。
3.Frame over Time: 在粒子生命週期裏面,播放第幾幀的圖片)就拿上面的來講,總共有4幀圖片,那麼這裏我寫0的話,他會播放第一幀的圖片,寫1的話,播放第二幀的圖片,如果是曲線的話,那麼就會在生命週期裏面,交替出現不同的幀圖片,也就形成了幀動畫。
4.Cycle:在生命週期內循環播放次數)基本上爲1,特殊情況自己搞。
接下來的組件是與之息息相關的:
Renderer:(渲染組件,就是渲染粒子的材質球)
1.Renderer Mode:(渲染模式)
(1-Billboard):渲染出來的粒子永遠朝向攝像機,也就是說攝像機無論在哪個角度,他都是表現材質球的正面。
(2-Stretched Billboard):渲染出來的粒子可以進行縮放,但是沒有正面朝向攝像機。什麼叫正面,就是說他原先發射的粒子什麼方向就是什麼方向。
調整Scale來拉伸粒子,這三個參數隨便改動那個都行。
(3-Horizontal Billboard):渲染出來的粒子都是水平朝向。
(4-Vertical Billboard):渲染出來的粒子都是豎直朝向。
(5-Mesh):渲染出來的粒子的Mesh。注意這個會和Texture Sheet Animation發生衝突。也就是說規定了粒子的mesh之後就不會有幀動畫產生。
Ok,剩下的你們自己去理解,看看名字其實就知道咋用。