Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
YENİ Niagara - Yağmur
#1

Niagara Parçacık Sistemi - Yağmur

Niagara'yı ilk kez kullanacaksanız önce > http://www.unrealengineturkiye.com/niaga...onusu.html

Bu bölümde 3 farklı emitter'dan oluşan, Niagara fonksiyonları ve collision events(çarpışma olayları) gibi özellikleri kullanan bir yağmur sistemi hazırlayacağız.

İlk olarak content browser içinde ihtiyacımız olan emitterlar ve bu emitter'ları çalıştıracak olan sistem'i yaratalım.

rain_1_zpscisp5ajf.jpg

Tut_CPURain_Emit oyuncuya yakın alanda kullanacağımız CPU emitter'ı olacak.
Tut_GPURain_Emit ise uzak mesafede kullanacağımız yağmur parçacıkları olacak. GPU parçacıkları performans açısından daha iyi fakat collision için CPU kadar güvenilir olmadığı için uzak mesafedeki parçacıklar olarak kullanacağız.
Tut_GPUSplash_Emit ise CPU parçacıkları bir yüzeyle temas ettiğinde ortaya çıkacak parçacıklar için kullanılacak.

Ana parçacık emitter'ımız olan Tut_CPURain_Emit ile başlayalım.

NOT: İsimlendirme yaparken yağmur, damlacık gibi Türkçe karakter içeren isimler kullanmamaya özen gösterin.


Tut_CPURain_Emit

İlk olarak emitter ayarlarına bakalım.
rain_2_zpsdyxbu43v.jpg

Değiştireceğimiz tek değer Spawn Rate olacak.
Spawn Rate'i 4000 olarak belirlediğimizde olacak olan, emitter bir saniye boyunca 4000 tane parçacık yaratacak ve bu parçacıklar biraz sonra belirleyeceğimiz ömür süreleri boyunca level içinde var olacak. Böylece, örnek olarak, lifetime(ömür süresi) 4 saniye olarak belirlenirse 4 sn içinde bu emitter 12000 parçacık daha üretecek. Max Loop Count değerini 0 olarak bıraktığımız için de BP içinde müdahele edip parçacık sistemini durdurana kadar emitter sabit olarak 16000 parçacık sayısına sahip olacak.

rain_3_zpsbigwwqch.jpg

Particle Spawn bölümünde Add Velocity ile parçacıklara başlangıç hızlarını vereceğiz. Uniform Ranged Vector inputuyla bir hız aralığı belirleyip, her oluşan parçacığın bu aralıkta rastgele bir değer seçip o hıza sahip olmasını sağlayarak daha gerçekçi sonuç elde edebiliriz. X ve Y yönünde verilen hız değeri de parçacıkları yere dik olarak değil, hafif bir açıyla yönlendirerek daha doğal bir görüntü sağlar.

Sphere Location parçacıkların doğacağı lokasyonu belirler. Radius(yarıçap) değeri 2000 olan bir küre oyuncunın ortada olduğunu farzesersek oyuncudan 20 metre öteye kadar olan alan içerisinde parçacıkların doğup yere düşmesini sağlar. Hemisphere Z seçili olduğunda ise bu küreyi Z ekseninde ikiye bölüp şeklini amacımıza daha uygun hale getireceğiz. Aşağıdaki resimde parçacıkların ilk doğuş anından ömürlerini tamamlayana kadarki konumlandırmasını görebilirsiniz.

rain_3_1_zps8f54utg8.jpg

Set Variables parçacıklara ait istediğimiz değişkenleri belirleyebileceğimiz bölümdür. Emitter'ı ilk açtığımızda burada varolan Sprite Rotation değişkenini ihtiyacımız olmadığı için kaldırdık(sağ taraftaki ters ok > Remove.) Lifetime değişkenini 2 olarak belirliyoruz. Parçacıklar için belirlediğimiz hıza göre 2sn yere değmeleri için yeterli bir süre. SpriteSize değişkeniyle de parçacığa yapısına ve biraz sonra hazırlayacağımız materyale uygun bir şekil veriyoruz.

rain_4_zps9wqaafdn.jpg

Color olarak istediğiniz rengi verebilirsiniz parçacığa. Burada varsayılanın dışında olan tek şey Scale Alpha, yani materyalin saydamlık çarpanı olarak kullanacağımız değişken. Particles.ColorAlpha değişkenini nasıl oluşturup kullandığımızı Particle Update bölümünün hemen ardından anlatacağım.

Aynı şekilde Collision Script modülü bizim hazırlayacağımız bir modül.

Collision Linear Impulse modülü bu durumda işimize yarayacak bir modül değil fakat, en azından şu aşamada, collision(çarpışma) sonrası parçacıklara bu şekilde bir davranış belirlemezsek collision event(çarpışma olayı) oluşmuyor. O yüzden Damping Velocity(hız zayıflatma) değerini 0.01(değer ne kadar küçük olursa hız o kadar çok zayıflar) gibi bir değerde bırakıp devam ediyoruz.

Generate Collision Event modülü parçacıklar bir yüzeyle temas ettiğinde diğer parçacıklar için kullanabileceğimiz bir event(olay) yaratır. Velocity Threshold değeri parçacık hızı hangi değerin altına düştüğünde collision event yaratmayı durdurması gerektiğini belirler. Bu durumda parçacık hızı saniyede 100 birim altına düşerse artık bir event yaratmayacaktır.
Bu eventi daha sonra sistemimiz içinde Tut_GPUSplash_Emit emitter'ı için kullanacağız.

Şimdi değişkenimizi ve modül scriptimizi yaratalım.


 -- Değişken Yaratma & Değişkeni Niagara Module Script İçinden Kontrol Etme

giphy.gif

İlk olarak gif'te görüldüğü gibi değişkenimizi oluşturup sürükleyerek kullanmak istediğimiz değere yerleştirelim.
Ardından, geçici olarak, particle update bölümünde yeni bir Collision Query oluşturup çift tıklayarak açalım, Script açıldıktan sonar silebiliriz.

giphy.gif

Gördüğümüz BP kodu temelinde Epic Games tarafından hazırlanıp editör ile birlikte gelen parçacığın bir yüzeyle çarpışıp çarpışmadığını kontrol eden bir modül scriptidir. Biz de bu kodu kopyalayıp kendi oluşturacağımız script içinde kullanıp Collision Script ismini vereceğimiz kendi modülümüzde kullanacağız ve aynı zamanda bu kod içinde Particles.ColorAlpha değişkenini kontrol edeceğiz. Buradaki kodu seçip ctrl + c ile kopyalayalım.

Şimdi kendi Collision Script isimli modülümüzü yaratalım.

rainScript_1_zps53ddmyyd.jpg

Bu scripti açtığımızda çıkacak olan boş alana kopyaladığımız kodu ctrl+V ile yapıştıralım ve gereken input/output/begin defaults pinlerini bağlayalım.

giphy.gif

giphy.gif

Ardından değişkenimizin inputunu şu şekilde oluşturalım.

giphy.gif

Türü float olan bir değişken seçip(bu durumda Lifetime) ismini emitter içinde yarattığımız Particles.ColorAlpha değişkeninin ismi ile değiştiriyoruz. Sonra da;

rainScript_3_zps4wk6qw7f.jpg

bir If fonksiyonu ile collision yani çarpışma olup olmadığına, collision var ise değerin 0 olması şeklinde değişkenimizi belirliyoruz.
Son olarak Emitter içinde Collision Script modülümüzü ve Collision Linear Impulse modülünü ekleyip daha önce Particle Update bölümünde göstermiş olduğumuz değerleri giriyoruz;

giphy.gif

Collision parametrelerine bakarsak;

Collision Size > parçacıkların çarpışma hesaplaması için sahip oldukları boyut.
Depth Bounds > GPU parçacıkları için çarpışma hesaplamasını yaparken kullanılan derinlik mesafesi.
Particle Friction > parçacıkların çarpışma sonrası yüzeyle olan sürtünme oranı. Değer arttıkça sürtünme artar.
Particle Restitution > Parçacıkların çarpışma sonrası sekme oranı.

CPU emitter’ımızda son olarak Render bölümüne bakıp ardından kullanacağımız materyale geçelim.

rain_5_zpsafcghifp.jpg

Değiştireceğimiz tek değer Alignment(hizalama) olacak. Bu değeri varsayılan haliyle bırakırsak parçacıklar her zaman için ve her açıda kameraya doğru bakar. Duman, alev gibi efektlerde parçacıkların 2D olduğu gerçeğinin önüne geçmek için kullanışlı olsa da burada absurd bir görüntü oluşturur. O yüzden Velocity Aligned kullanıp parçacıkların hız istikametine göre hizalanmalarını sağlamış olacağız.

Kullanmış olduğumuz materyale gelince;
Content Browser içinde yeni bir material oluşturun. Materyali açın ve Details panelinde şu değişiklikleri yapın:

rainMAT_1_zpsp1qa4hik.jpg

Yağmur parçacıkları saydam olacağı için Blend Mode > Translucent olacak.
Performansı etkilememesi için ışık kaynaklarından etkilenmesini istemiyoruz, bu yüzden Shading Model > Unlit olacak.
Depth of Field derinlik efekti kullanırsanız parçacıkların olması gerektiği gibi odaklamada hesaplanması için Render After DoF(Derinlik efektinden sonar render et) kapalı olacak.

Aşağıdaki gibi bir düzen kurarak materyalimizi hazırlıyoruz:

rainMAT_2_zpsuxncixb7.jpg

Kullanılan texture Content Examples projesiyle gelen texturelardan birisinin modifiye edilmiş halidir.
Droplet_rain_zpsiizriabh.png

Göründüğü üzere gayet basit bir material kullanacağız. Particle Color Niagara içinden renk ve saydamlık ayarlarını yapmamıza yararken Pixel Depth hesaplaması da ekranda görünen parçacıkların kameraya 256 birimden yakında olunca saydamlığını yitirmesini sağlıyoruz. Böylece oyuncu kameraya çok yakın mesafeden geçen görüşü engelleyecek parçacıklar görmeyecek.


Şimdi Çarpışma anında oluşacak dağılan damlacık emitter’ımıza geçelim.



Tut_GPUSplash_Emit

NOT: Bu emitter normalde GPUCompute olacaktı fakat GPU parçacıklar şu aşamada event yollama/alma işlemini olması gerektiği gibi yapmıyor. O yüzden şimdilik CPUSim olarak kullanacağız.
Sorun bug olarak bildirildi, takibini şuradan yapabilirsiniz: https://unreal-engine-issues.herokuapp.c...e/UE-64938

rainSplash_1_zpsjvpo8kpk.jpg

NextLoopDuration değerini 0.25 olarak belirliyoruz. Bu değer birazdan belirleyeceğimiz Lifetime değerini takip edecek. Süreyi bu kadar kısa tutmamızın nedeni ulaşmak istediğimiz efektin doğasından kaynaklanıyor.

Spawn Rate modülünün varolması yeterli olacak bu emitter için. Vereceğimiz değerin bir anlamı yok, parçacık sayısını Event Handler bölümünde control edeceğiz.

rainSplash_2_zpssxwd4ydq.jpg

Particle Spawn bölümünde Velocity değerini sağ taraftaki ters ok şeklindeki düğmeye basarak Vector from Float ile float değişkenine dönüştürüp, bu emitter için parçacıkların hareket etmeye ihtiyacı olmadığından 0 olarak belirliyoruz.

Lifetime değerini 0.2 – 0.25 aralığında veriyoruz(Emitter loop duration’dan hatırlayalım.)

Particle Sprite Rotation değerini 0 – 210 arası veriyoruz. Böylece her parçacık doğduğu anda farklı açıda olup tekrarların farkedilme olasılığı azalır. Biraz sonra kullandığımız texture’ı görünce neden bu şekilde yaptığımızı daha iyi anlayacaksınız.

Sprite Size değerini 1 olarak bırakıyoruz. Parçacık boyutunu Particle Update bölümünde ayarlayıp parçacık boyutunu zaman içinde değiştireceğiz.

Son değişkenimiz SubImage Index için 0 - 3 aralığı rastgele bir değer seçtiriyoruz. SubImage Index neyin nesidir bu emitter için kullanacağımız materyali hazırlayarak görelim.

Materyalimizi yarattıktan sonra aşağıdaki kodu hazırlayalım.

rainSplashMAT_1_zpsffr7lk6y.jpg

Texture için bu sefer Texture Sample yerine Particle SubUV node’unu kullanıyoruz. Normal bir Texture 0-1 UV aralığında hesaplanırken SubUV ile parçacık sistemi UV alanını kullandığımız texture’daki kare sayısına bölüp her birini ayrı bir texture olarak gösterir. Hatta parçacık sistemindeki SubImage Index değerini Particle Update ile 0 – 3 aralığında yaptırırsak(lu anda kullandığımız texture toplamda 4 kareden oluşuyor) texture bir filmin kareleri gibi sırasıyla geçip hareketli texture görüntüsü verir. Duman, alev gibi efektler için yapılan genellikle budur fakat bizim şu anki sistemimizde her parçacığa farklı görüntüye sahip olma olasılığını arttırmak için Paricle Spawn ile doğdukları anda tek bir kare seçtiriyoruz.

Texture’I oluşturmak için 1024x1024(texture hazırlarken her zaman hedeflediğiniz çözünürlüğün en az 2 katı çözünürlükle başlayın) çözünürlükte boş, siyah yüzeyi dörde bölüp her parçaya internet üzerinden Photoshop veya Gimp için bulabileceğiniz ücretsiz su damlacığı brush’ları(water droplet brush ve water splash brush olarak aratabilirsiniz) ile istediğim şekilleri çizdim.

T_WaterSplash_zpsvffmtauh.png

Depth Fade çarpanı translucent materyallerde kullanılabilinen, objenin opak bir objeyle kesiştiğinde keskin bir şekilde geçiş yapmasını engeller. Burada kullandığımız Fade Distance değeri 4’tür. Aşağıda karşılaştırmalı örneğini görebilirsiniz(depth fade sağda açık.)

rainSplashMAT_2_zps1iavadjc.jpg

Splash emitter’ımızın diğer bölümlerine devam edebiliriz.

rainSplash_3_zpspztoh0fj.jpg

Color modülünde değişkenimizi Color from Curve olarak değiştiriyoruz ve saydamlığı(Opacity) başlangıçta 1, sonda(parçacık ömrünü tamamladığı zaman) 0 olacak şekilde giriyoruz.

+ butonuna basarak Sprite Size Scale modülü akliyoruz. Bu module Particle Spawn bölümünde 1 olarak verdiğimiz boyut değerini parçacık ömrü boyunca değiştirebiliyoruz. Scale Factor değişkenini Vector 2D from Float, bunu da Float from Curve olarak dönüştürüp değerleri eğriye giriyoruz.

Time = 0 > Value = 1
Time = 1 > Value = 40

Sonuçta elde edeceğimiz parçacık:
giphy.gif

Ardından CPU emitter'ımızdan gelecek olan collision event'ini lgılaması için bir event handler ekleyelim.

giphy.gif


Bu emitter’da son olarak Render modülüne bakalım.

rainSplash_5_zpsqykg2iqn.jpg

Bu sefer Alignment’I olduğu gibi bırakıyoruz. Bu parçacık için kullandığımız texture gereği SubUV bölümünde Sub Image Size 2, 2 olarak sıra ve sütun sayısını giriyoruz.


Tut_GPURain_Emit

rainGPU_1_zpsrtklc2cj.jpg

Emitter bölümünde CPU emitter bölümündekinden farklı olan pek birşey yok. Sim Target GPUCompute Sim olarak belirlenip parçacık oranımız da 4000 olacak.

rainGPU_2_zpsltnxp7rd.jpg

Particle Spawn bölümünde yapacağımız en büyük değişiklik parçacıkların doğuş yeri olarak bir torus kullanmamız olacak. Resimdeki değerleri girdiğimizde CPU emitter’ın küre şeklini kapsayacak bir simit şekli oluşacak.
Tepeden baktığımızda aşağıdaki gibi görebilirsiniz:

rainGPU_2_2_zpsakqnbt7r.jpg

Particle size değerini dilerseniz efekti biraz daha dolgun göstermek için CPU parçacıklarından daha büyük tutabilirsiniz.
Geriye kalan parametreler CPU emitter ile aynı olacak.

rainGPU_3_zps7onojydl.jpg

Particle Update bölümünün CPU emitter’dan tek farkı Collision Event kullanmamamız olacak.

Render bölümü CPU emitter ile aynı olacak. Materyal dahil.


Artık emitter’larımızı system içine çağırıp kullanıma hazır hale getirebiliriz.



Tut_Rain_System

Önce sistemi açıp tüm emitter’ları Timeline içine yerleştirelim.

rainSystem_1_zpsgqrvi501.jpg

Ardından Tut_GPUSplash_Emitter’ı seçip Event Handler modülüne bakalım.

rainSystem_2_zpsaaduhcz7.jpg

Source, yani kaynak menüsüne baktığımızda CPU yağmur emitter’ından gönderdiğimiz collision olayı artık görünür olacak. Önceden belirlediğimiz Max Events Per Frame değişkeni düşen parçacık sayısı ne olursa olsun bir frame içinde hesaplanacak maximum collision olaylarını 2000’e sabitler.

Son olarak Tut_GPURain_Emit emitter’ını seçip Render bölümünde Sort Order belirleyeceğiz.
 
rainSystem_3_zpsfxigcn4u.jpg

Diğer emitter’lar 0 olduğu için GPU parçacıklarına daha yüksek bir değer verip diğer parçacıkların arkasında render edileceklerinden emin olacağız.


Artık parçacık sistemimizi karaktr BP içine yerleştirip kullanabiliriz.






Not - 1: Parçacıkların hızlarını, sayısını, boyutlarını, material özellikleri değiştirmek projenizin görsel ve teknik gerekliliklerine kalmış. Burada kullanılan değerler sistemin nasıl çalıştığını daha rahat göstermek için biraz abartılmış olabilir.

Not - 2: Resimlerin linkleri arada sırada çalışmayabilir. Photobucket'tan kaynaklanan bir sorun ama geçicidir.


Anlaşılmayan noktalar varsa sorularınızı burada veya Discord > Niagara kanalında sorabilirsiniz.
Özelden sorulan UE4 soruları cevaplanmayacaktır...
Cevapla
 


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Niagara Parçacık Sistemi - Giriş Jacky 2 434 04-10-2018, Saat: 23:52
Son Yorum: ahtek07

Hızlı Menü:


Unreal Engine Türkiye

This forum is only for fans and support. It has nothing to do with Epic Games.

Bu site sadece fan ve destek amaçlıdır. Epic Games ile bir ilgisi yoktur.