之前的案例
UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.1->1.4_多方通行8的博客-CSDN博客
UE4/5Niagara粒子特效之Niagara_Particles官方案例:1.5->2.3_多方通行8的博客-CSDN博客
2.4 Location Events
?這次的項(xiàng)目和之前又有很大的不同,它是由3個(gè)發(fā)射器組成的:
?創(chuàng)建事件處理器:
可以看到右邊的兩個(gè)發(fā)射器里面,都有一個(gè)事件處理器,在里面處理事件:
很多人不知道是如何創(chuàng)建的,這里便展示一下:
準(zhǔn)備一個(gè)Empty的發(fā)射器,然后在屬性那里,有一個(gè)“+階段”,點(diǎn)擊后,有一個(gè)事件處理器,創(chuàng)建即可。
可是創(chuàng)建出來的事件處理器還是空的,所以我們要在源進(jìn)行添加:
?
?添加之前,記得在其他發(fā)射器部分是需要有事件的,否則是無法進(jìn)行添加的:
?分辨不同發(fā)射器是干什么的
對(duì)于這種有多個(gè)發(fā)射器的情況,只需要將某個(gè)發(fā)射器取消,就知道這個(gè)的功能是什么。
將右邊取消勾選后,可以看到NS【Niagara System】里面的掉落小球效果消失了。
將左邊取消勾選后,可以看到NS【Niagara System】里面的拖尾條帶效果消失了。
?
?然后我們就可以知道第一個(gè)發(fā)射器的作用是向上發(fā)射球粒子,然后自然下降【類似噴泉的效果】:
這邊就不做詳細(xì)刨析了,想必能看到這的都明白Niagara的基礎(chǔ)了。
第一個(gè)發(fā)射器
簡單的講解一下:
首先是發(fā)射器更新里面,其粒子生成的速度是1.333每秒。
然后在粒子生成里面,生成的范圍是一個(gè)半徑為8的圓形里面,然后在生成后會(huì)向上錐形添加250-400范圍速度。
之后在粒子更新里面,添加了重力和解算器。
這也是我說什么這個(gè)發(fā)射器類似于噴泉的原因。
最后就是下面這張圖,生成位置事件:
第一個(gè)是模式,這里是可以進(jìn)行設(shè)置的,這里面是Send Rate.
下面的30是每秒發(fā)送的事件數(shù)。【注釋:這不是一個(gè)準(zhǔn)確的數(shù)字,因?yàn)槲覀儧]有考慮到余數(shù)。】
下面的打勾是允許發(fā)送這個(gè)事件,這樣的話,它的每一次發(fā)送都會(huì)被有需要的發(fā)射器所接收?!具@個(gè)如果為false,那么其他發(fā)射器就無法接收到這個(gè)事件】
下面我們可以看到它發(fā)送出去的一些屬性。
?文章來源地址http://www.zghlxwxcb.cn/news/detail-696970.html
?第二個(gè)發(fā)射器
前面就是根據(jù)生命周期更改顏色,但沒有生成粒子。
打開事件處理器可以看見:
它接收到了第一個(gè)發(fā)射器發(fā)送的事件【源進(jìn)行設(shè)置】
然后執(zhí)行生成1個(gè)粒子。
Receive Location Event
接收位置事件,例如由“生成位置事件”模塊生成的事件??蛇x地將事件負(fù)載直接寫入接收粒子的屬性。通過展開事件生成器上的高級(jí)屬性并覆蓋事件發(fā)送的默認(rèn)數(shù)據(jù),可以從GenerateL ocationEvent發(fā)送自定義數(shù)據(jù)。
可以看到有些是Apply【應(yīng)用】,有些是Output【輸出】。
比如生命周期Normalized Age是Output,所以用的是它自己的生命周期,如果使用的是Apply,那么用的就是第一個(gè)發(fā)射器粒子的生命周期,可以看看效果,NS的效果不一樣的很明顯。
?第三個(gè)發(fā)射器
第三個(gè)發(fā)射器的表現(xiàn)是類似于主發(fā)射器的球后面的頭皮屑拖尾【很多2d的那種類似的星星拖尾效果】
所以我們看看:
初始化的大小是2.5-6隨機(jī)的,而壽命是0.875-1.25之間,這也就是我們看到他像火芯一樣快速消散的原因。
然后是添加速度,以一種線性的添加,速度是隨機(jī)的3個(gè)-32到+32.
之后是重力,重力高達(dá)-250.
?
?接下來就是事件處理器:
可以看到是接收一次生成一個(gè)粒子【改為100還挺好看的】
之后是接收相關(guān)的屬性。?
然后這里是生成的位置,在獲取了球的位置之后,我們?cè)谶@個(gè)位置的四周半徑為1的位置進(jìn)行隨機(jī)生成粒子。
最后便是渲染器。
2.5 Expressions
表達(dá)式。
我們打開這個(gè)粒子特效可以發(fā)現(xiàn),與我們之前寫的時(shí)候不一樣。
那是因?yàn)槲覀冎笆褂玫氖悄K,類似于藍(lán)圖中的函數(shù),然后將屬性放到函數(shù)中去。
而這里則是對(duì)屬性直接進(jìn)行調(diào)整:
?
?這種是怎么做的呢?:
創(chuàng)建一個(gè)發(fā)射器,選擇,然后左下角就會(huì)出現(xiàn)各種各樣的屬性,直接拖入即可。
?可能會(huì)發(fā)現(xiàn)我們創(chuàng)建了空的發(fā)射器后,怎么找不到一些屬性,那是因?yàn)槲覀兪强梢宰约喝ミM(jìn)行創(chuàng)建的:
?所以接下來我們來看看:
發(fā)射器更新
每秒生成1000個(gè)粒子
?一開始的初始化是NS【Niagara System】的位置。
而第二個(gè)ZOffset則開始不一樣了,用的是自定義表達(dá)式:sin(Emitter.Age)*56
我們來看看這個(gè)表達(dá)式是什么意思:使用sin()函數(shù)計(jì)算發(fā)射器年齡(Emitter.Age)的正弦值,然后將正弦值乘以56。
這樣子在一個(gè)屬性的集內(nèi)添加其他屬性
?粒子生成?
集1
使用rand()函數(shù)生成一個(gè)三維隨機(jī)向量,參數(shù)為float3(1.0,?1.0,?1.0),表示每個(gè)維度的取值范圍為[-1,?1],將生成的隨機(jī)向量乘以2,得到一個(gè)新的三維向量,然后從得到的這個(gè)三維向量中減去1,得到一個(gè)新的三維向量,對(duì)其進(jìn)行歸一化處理,使其長度變?yōu)?,得到一個(gè)單位向量。
集2
1.?屬性Lifetime
???這個(gè)表達(dá)式表示粒子的壽命屬性(Lifetime)是一個(gè)在[2.2,?3.7]范圍內(nèi)的隨機(jī)值。
2.?屬性Position
???這個(gè)表達(dá)式表示粒子的位置屬性(Position)等于發(fā)射器的初始位置(Emitter.InitialPosition)加上一個(gè)隨機(jī)三維向量(Particles.RandomVector)乘以一個(gè)在[0,?145.0f]范圍內(nèi)的隨機(jī)值。
3.?屬性SpriteSize
這個(gè)表達(dá)式表示粒子的精靈大小屬性(SpriteSize)是一個(gè)在[0.5,?3.0f]范圍內(nèi)的隨機(jī)值,因?yàn)槭荲ector2D from float,所以它是將兩個(gè)浮點(diǎn)賦予一個(gè)向量2d。
4.?屬性Velocity
cross(Particles.RandomVector,?float3(0,8,0))?*?(float3(0.0f,?0.0f,?Emitter.ZOffset)?*?0.2f)?+?(-1.0f?*?normalize(Emitter.InitialPosition?-?Particles.Position)?*?20)
? 首先,計(jì)算發(fā)射器的初始位置與粒子的當(dāng)前位置之間的方向向量差(Emitter.InitialPosition?-?Particles.Position),并將其歸一化。
? ?然后使用向量積函數(shù)(cross)計(jì)算粒子的隨機(jī)向量(Particles.RandomVector)與float3(0,?8,?0)之間的向量積。
???將上面的兩個(gè)向量積相加,并乘以(float3(0.0f,?0.0f,?Emitter.ZOffset)?*?0.2f),最后將結(jié)果乘以-1.0f。
?粒子更新
集1
是ue5的Niagara系統(tǒng):
Color:意思很簡單,獲取的是Particles.NormalizedAge是否小于0.333,是,值則變成float4(1,0.1,0.1,1),不是則判斷是不是小于0.575?是,值為float4(0.1,1,0.1,1),不是,值為float4(0.1,0.1,1,1)
Particles.NormalizedAge < 0.333 ? float4(1,0.1,0.1,1) : Particles.NormalizedAge < 0.575 ? float4(0.1,1,0.1,1) : float4(0.1,0.1,1,1)
Position:
這個(gè)表達(dá)式通過在z軸方向上根據(jù)sin(Engine.Time)的值進(jìn)行偏移,來改變粒子的位置。
Particles.Position + float3(0, 0, ( sin(Engine.Time) * 0.3f ))
SpriteSize:
使用的是Multiply Vector2函數(shù),即A*B
A是SpriteSize,即粒子的大小。
B是(1.0f - abs(Particles.NormalizedAge * 2.0f -1.0f)) * 2.0f
即先計(jì)算:Particles.NormalizedAge?乘以?2.0?后再減去?1.0得到的值,這個(gè)值做一個(gè)絕對(duì)值【架設(shè)為TempA】,然后用?1減去TempA【架設(shè)為TempB】。
最后將TempB乘以?2.0。
PhysicsForce:
Particles.RandomVector:這個(gè)部分表示粒子的隨機(jī)向量。它可能是一個(gè)在某個(gè)范圍內(nèi)隨機(jī)生成的向量。
Particles.Position?-?Emitter.InitialPosition:這個(gè)部分計(jì)算了粒子位置與發(fā)射器初始位置之間的向量差。它表示了粒子與發(fā)射器之間的距離。
length(Particles.Position?-?Emitter.InitialPosition):這個(gè)部分計(jì)算了向量差的長度,即粒子與發(fā)射器之間的距離。
(length(Particles.Position?-?Emitter.InitialPosition)*0.25):這個(gè)部分將粒子與發(fā)射器之間的距離乘以0.25,得到一個(gè)新的值。
Particles.RandomVector?*?(length(Particles.Position?-?Emitter.InitialPosition)*0.25):這個(gè)表達(dá)式將粒子的隨機(jī)向量與上一步計(jì)算得到的新值相乘。
1-Particles.RandomVector?*?(length(Particles.Position?-?Emitter.InitialPosition)*0.25):這個(gè)部分將結(jié)果減去粒子的隨機(jī)向量。
1-Particles.RandomVector * (length(Particles.Position - Emitter.InitialPosition)*0.25)
?集2
1.?Particles.Position.z:這個(gè)部分表示粒子位置的z坐標(biāo)。
2.?Emitter.InitialPosition.z?-?Emitter.ZOffset:這個(gè)部分計(jì)算了發(fā)射器初始位置的z坐標(biāo)減去一個(gè)偏移值,得到一個(gè)新的z坐標(biāo)。
3.?Particles.Position.z?>?Emitter.InitialPosition.z?-?Emitter.ZOffset:這個(gè)部分判斷粒子位置的z坐標(biāo)是否大于發(fā)射器初始位置的z坐標(biāo)減去偏移值。
4.?Particles.Position:如果上一步的判斷為真,即粒子位置的z坐標(biāo)大于發(fā)射器初始位置的z坐標(biāo)減去偏移值,就返回粒子的位置。
5.?float3(Particles.Position.x,?Particles.Position.y,?Emitter.InitialPosition.z?-Emitter.ZOffset):如果上一步的判斷為假,即粒子位置的z坐標(biāo)不大于發(fā)射器初始位置的z坐標(biāo)減去偏移值,就返回一個(gè)新的向量,其中x和y坐標(biāo)與粒子位置相同,但z坐標(biāo)為發(fā)射器初始位置的z坐標(biāo)減去偏移值。
Particles.Position.z > Emitter.InitialPosition.z - Emitter.ZOffset ? Particles.Position : float3(Particles.Position.x, Particles.Position.y, Emitter.InitialPosition.z -Emitter.ZOffset)
?2.6 Collision
打開可以看見里面是有3個(gè)發(fā)射器,第一個(gè)就是NS中噴射的大球,第二個(gè)是噴射的小球,第三個(gè)是在產(chǎn)生碰撞時(shí)候生成的小球。
?第一個(gè)發(fā)射器
生成速度是3.5個(gè)每秒。
初始化的生命周期為7秒,大小為14.
按錐形添加速度250-750之間,角度是35°。
圓形,半徑為10的范圍內(nèi)生成。
重力在z軸是-980
使用碰撞:相關(guān)的系數(shù)設(shè)置都和其名字一樣。
?發(fā)送碰撞事件:
碰撞事件之間的延遲是0.05,而粒子速度如果小于100,則無法發(fā)送事件。
?最后就是顏色的變化了。
上面和之前的一樣,不一樣的是通過是否碰撞的bool來決定顏色的值是0還是1.
?第二個(gè)發(fā)射器
第二個(gè)發(fā)射器和第一個(gè)基本相同,不同的只有初始化時(shí)候的大小,以及沒有發(fā)送碰撞事件。
?第三個(gè)發(fā)射器:
上面是一樣的,3-4秒的生命周期,錐形的添加速度,大小的更新是用了自定義表達(dá)式:1.0f-Particles.NormalizedAge。
重力是-980.
這個(gè)發(fā)射器沒有直接生成粒子,而是在事件處理器中進(jìn)行生成。
生成之后繼承了一些相關(guān)的碰撞法線之類的。
?3.1 Static Mesh Sampling?
?這個(gè)粒子特效使用的是采樣到的靜態(tài)網(wǎng)格體。
?通過外部進(jìn)行采樣,在CPU的時(shí)候【筆者是失敗的,而有些人可以,筆者也不知道為什么】:?
不過轉(zhuǎn)為GPU模擬即可:
?3.2 Renderer Overrides?
打開NS:
生成速度是1.4每秒。
?在這里我們可以看到是按照?qǐng)A形進(jìn)行生成的,不過,如果將下方的集關(guān)閉,那么只有mesh是按照?qǐng)A形生成的,而Sprite不是,原因也很簡單,在集和渲染器那里。
?
?Vortex Force和drag都是力的使用,就不多說了。
看看這個(gè)集:RenderOffset,這是一個(gè)創(chuàng)建的變量,屬性為位置。
可以看到是粒子的位置+z軸的20,即mesh所在的位置+z軸20.
可是就這樣,它是如何把這個(gè)粒子的位置傳遞的呢??
在Sprite渲染器我們可以看見:
它的位置綁定被更改了,改為了我們計(jì)算的RenderOffset。?
文章來源:http://www.zghlxwxcb.cn/news/detail-696970.html
?
到了這里,關(guān)于UE4/5Niagara粒子特效之Niagara_Particles官方案例:2.4->3.2的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!