"bir yazılımcının not defteri.."

28 Kasım 2016 Pazartesi

Unreal Engine 'de Component ler

tekrar merhabalar,

makalelerdir Actor! Actor! deyip durduk, oysaki Unreal Engine in olduğu her yerde en az Actor kelimesi kadar çok kullanılan bir diğer kelimeyi unuttuk: Component.

Bu makalemizde Unreal Engine deki Component kavramından söz edeceğim.

Aslında hayli önemli olan bu component ler iyi bilmek motorun özelliklerini de iyi bilmek anlamına geliyor; bu da elinizdeki silahın gücünü daha iyi kullanabilmek demektir.



öyleyse başlayalım,

Component nedir ?
en temel tanımlamayla bir Component:  "bir Actor e eklenebilen bir parça fonksyonelliktir". Actor ler bir anlamda bu fonksyonelliklerin tümüdür denebilir.

Componentler, Actor lerin içinde alt obje olarak tanımlanan  "özel tipteki"  Object lerdir. Actor ün bazı yönlerini (davranış veya fonksyonalite) değiştirmek / geliştirmek için kolayca değiştirilebilir ve yeniden kullanılabilir parçalara sahip olunması gereken durumlarda oldukça kullanışlıdır.

örneğin, bir araba kontrol edilir ve bir uçaktan çok farklı bir şekilde hareket eder; bir tekne daha da farklı bir şekilde kontrol edilmektedir vs. vs.  dolayısı ile bir Component kullanarak controller i ve hareketi yönetmek için üretilen aynı component kolaylıkla farklı tiplerde iş görecek şekilde ayaranabilir; ya da belli bir tipte iş gören bir component farklı tiplere de eklenebilir durumdadır.

genellikle, alt object lerin (sub-objects) default davranışının aksine Component ler bir Actor ün instance edilişi içinde yaratlılır. bunun anlamı belli bir class ın her Actor instance i kendi uniq Component instance ini alır. bunu gözünde canlandırmanın en kolay yolu, bir araç hayal edin, yukarıda açıklandığı gibi. bir araba sınıfı tekerlekleri temsil etmek için Component leri kullanarabilir; tekelerlek component leri için default sınıf propertileri içinde sub-obje ler yaratılacak ve Wheels[] array a atanacak. yeni bir araba instance i yaratıldığında, bu özel tekerlek (wheel) component leri de bu araç için yaratılır. bu durumda olmasa idi , dünyada bir araba hareket ettiğinde tüm arabaların tekerlerkleri dönerdi :) ki bu istenmeyen bir durumdur. Component instance leri defaul olarak Actor lere sub-objel lerini hızlıca eklemeyi kolaylaştırır; Component instanslama olmadan, tüm Component değişkenlerinin Instances property belirteci kullanılarak tanımlanması (declare) gerekirdi.

Akla şöyle bir soru geliyor: bir Actor zaten başka bir Actor e eklenebiliyorsa (ki eklenebiliyor) neden alt bileşenlerini  adı ile farklı ifade ediyoruz?

Cevap olarak yine Actor lerin en karakteristik özelliğine bakmak gerekiyor; bu da başta level içinde bir konumlarının ve diğer objeler ile etkileşimlerinin (interact) olması idi.  Component ler ise çoğu durumda kendi başlarına bir işe yaramıyorlar. Birer gözle görülür elle tutulur varlıklar değiller, sadece belli bir işi yerine getirmesi için parametrik halde programlanmış tekrar kullanılabilen ve Actor lere eklediğimizde onlara kendi özelliğini katan "programatik öğeler" dir diyebiliriz.

Componentler, Actor lerin içinde alt obje (sub-object) olarak tanımlanmış özel tipteki objelerdir.

Componentler, Actor ün bazı yönlerini değiştirmek, yeni davranışlar, yeni özellikler eklemek içindir.

Component ler sayesinde bir Actor özellikleri kolayca değiştirilebilir parametrik parçalara sahip olur.

Component ler kendi başlarına var olamazlar, fakat bir Actor e eklendiklerinde, Actor artık bu Component in sağladığı fonksyonaliteye sahip olur ve onu artık kullanabilir; ya da o özelliğe erişebilir olur.

Örneğin,
bir Spot Light Component, Actor ümüze spot lamba gibi ışık yayma niteliği katar;
bir Rotating Movement Component, Actor ümüze dönebilme yetisi verir;
bir Audio Component Actor ümüzün artık ses çalabilmesini sağlar; vs..


Actor lere istediğimiz kadar Component ekleyebiliriz!

bir Actor e bir Component eklemek, parçalarının bir arada tutulduğu, ama birlikte görev yapıkları tek bir objeye bir yeni parça eklemektir. Böyle bir Actor ü de level içine sürüklediğimizde, onu oluşturan bu parçalar (component ler), artık tek bir Actor simgesi ile görünecektir; ama doğrudan görünmeyen bir arka planda her biri ayrı ayrı level e eklenmiş olacaktır.

Hemen bir örnek ile durumu daha iyi anlayalım:

bir arabadaki tekelerlekler, direksiyon, araba gövdesi, araba ışıkları, silecekleri vs.. bunların her biri component olarak düşünülebilir iken arabanın kendisi bir Actor dür!

yani aslında bir anlamda Component ler,  Actor ün simyasını tanımlamaktadır da diyebiliriz.

Bir Actor ü levelimize Blueprint scripti veya ağır C++ koduna gerek kalmadan sürükle bırak ile dahi kolayca ekleyebildiğimize göre, Actor level içinde oluştuğu an onu oluşturan component ler de oluşurlar. Zaten,, sadece var olmaları için onların nasıl işleyeceğine dair talimatların verilmesi de şart değildir. Elbetteki bir amaçla ekleyeceğimize göre hangi durumda nasıl davranacaklarını yani mantık (logic) lerini Blueprint scripti veya C++ kodu ile belirtmemiz gerekecektir. Mesela biraz önceki araba örneğinden gidecek olursak farlar, silecekler, radyo vs. bazı button lar ile çalışmaya başlar; direksiyon input girdilerine göre döner ve arabayı döndürür; tekerlekler de buna göre tepki vermeye başlayabilir vs. nasıl programlamış isek artık öyle işlerini yapacaklardır. Bunlar hiç programlanmamış olsa bile Araba Actor ünü sürükletip bıraktığımızda tüm bu parçalar da yine oluşurdu, ama fonksyonsuz olurlardı. O yüzden Actor e eklediğimiz componet lerin davranışlarını programlamamız da gerekir.


Component Instancing
Instancing
, programcıların gayet iyi bildiği,  bir sınıf (class) ın tipinden kopya nesneler üretmek için kullanılan tabirdir. Örneğin koyun bir sınıftır, koyun sınıfında 500 ayrı koyun türetebilirsiniz. Koyun sınıfı burada class, yani veri tipdir; mantıksal varlıktır. Üretilenler birer nesne, obje veya Instance yani nesnenin örnekleridir. Dolayısı ile  Component Instancing, ilgili Component tipinden bir nesnenin hafızada oluşması demektir.

Actor ü oluşturan Component ler Actor ün instance edilişi anında yaratlılır.

Bunu biraz daha açalım;

bir Actor bir çok alt bileşenden (sub-object) yani Component lerden oluşabiliyor demiştik; bu durumda bir Actor sınıfı, başka component sınıflarını da içeriyor demektir ve bu Actor den bir Instance yarattığımızda, örneğin level imize sürükleyip bıraktığımızda, o Actor ü oluşturan tüm Componentlerin de Instance ları yaratılır. Ancak bu Component instance ları sadece o (yeni oluşan) Actor nesnesine bağlıdır. Yani her Actor Instance i kendi unique Component kopyalarına sahip olur ve kendisinin olanları kullanır.

Şimdi yine araba örneğini düşünürsek: araba sınıfının dört tekerleğin Componen leri  Actor sınıfının default properti lerinde alt Tekerlek objesi (sub-object) olarak yaratılmıştır ve "tekelerkler" Array ine atanmiştır.  Yeni bir “Araba” instance i yaratıldığında da Tekerlek Component lerinin de yeni instance leri, yani kopyaları bu yaratılan araba Actor instance ine özel olarak yaratılır. Eğer bu böyle olmasa idi zaten bir araba hareket ettiğinde level deki tüm arabaların tekerlekleri dönerdi :)

Bu durum, yani Componentlerin Actor lere unique olarak eklenmesi sürecimizi basitleştiren ve hatta zevkli hale getiren bir durumdur.  Object Oriented programlama bilen kişiler için bu gayet sıradan bir durum olsa da ortam bir oyun ortamı olduğunda iş değişiyor  :)



şimdi Unreal Engine nin bize hazır olarak sunduğu bazı component lere gözatalım ve kısaca açıklayalım:


AI Component leri
Artificial Intelligent kelimelerinden kısatma olan AI kelimesi yapay zeka demektir ve yapay zeka günümüz ve geleceğin yükselen trendi olmakla birlikte oyun konusunun da vazgeçilmezlerinden biridir.

AI Component leri de özellikle Pawn ların duyusal / algısal bilgilerini ortamdan almalarını sağlayan Component lerdir; örneğin bir gelen sesin nereden geldiği veya Pawn ın birşeyi görüp göremeyeceği bilgisi gibi.

Temel AI Component tiplerine bakacak olursak:

AI Perception Component
Perception, biraz evvel bahsettiğimiz "algı" demektir. Bir AIPerceptionComponent de, AIPerceptionSystem ine "uyarıcı listener"  (dinleyici) kaydeder ve kayıtlı uyarılara uygun yeni bir uyarı / algı(lar) aldığında bir araya getirip yığın (batch) halinde UpdatePerception fonsksyonu çağrılır.

Pawn Noise Emitter Component
bir PawnNoiseEmitterComponent, bir Pawn ın duyabilmesi için SensingComponent leri kullanarak gürültü (noise) olay datasını izler. Bu Component in bir Pawn veya onun Controller i üzerinde olması amaçlanır.

Pawn Sensing Component
bir PawnSensingComponent görme ve duyma algısı gibi algı ayarlarını kapsuller (dışarıdan soyutlar) ve bunları bir Actor için fonksyonalite yapar; böylece bir Actor ün dünya içinde görme / duyma Pawn özellikleri kazanmasını sağlar; bu component server üzerinde çalışır; network client ları üzerinde birşey yapmaz.


Audio Component leri
bir AudioComponent oyunumuza ses örneği eklemek ve onu kontrol etmek için kullanılır. 
Bir Actor e bir alt obje (sub-object) olarak eklenen AudioComponent, sağlanan bir ses kaynağından Sound Wave veya Sound Cue eklememizi sağlar.

Örneğin level imizde ateş benzeri bir particle effect istiyoruz diyelim; particle effect i tek başına kullanmak sadece görsel olarak ateşi yansıtır; bir ses çıkarmaz; ama AudioComponent i de bir alt obje (sub-object) olarak ona ekleyerek artık alev saçarken aynı zamanda bir audio asset de çalar ki, bu çok daha inandırıcı bir tablodur.

BluePrint veya C++ ile runtime anında fade in veya fade out gibi AudioComponent in ayarlarındaki bir kaç property i değiştirerek çalma, durdurma, ses volume ini ayarlama ve ila diğer ayarlar mümkündür.



Camera Component leri
CameraComponent, en temel/yalın tanım ile, bir Actor e camera perspektifi, yani bir  "bakış" ekler.

Aslında CameraActor dediğimiz şey CameraComponent e bir de SceneComponent ilave edilip genişletilerek daha gelişmiş camera özellikleri taşıyan ve de sahneye konumlandırılabilir bir Actor yaratılmasından başka birşey değildir. Yani CameraComponent, CameraActor ün içinde zaten bulunduğu gibi, başka herhangi bir Actor ün içinde de olabilir, ve ona (view) bakış özelliğini verebilir. 

CameraComponent,  ViewTarget i bir CameraActor ise, veya CameraComponent içeren başka bir Actor ün bFindCameraComponentWhenViewTarget özelliğini true olarak set edilmiş ise kamera özellikleri (properties) hakkında bilgiler sağlar.

CameraComponent, collision çarpışması veya köşelerden dönüş gibi kamera hareketlerinin dinamik değişmesi gereken durumlarda bunu hareketliliği otomatik olarak sağlayan SpringArmComponent ile birlikte kullanıldığında oyun ortamına bir "third person" perspektifi fonksyonelliği sağlar. Call of Duty gibi oyunlar bu özelliğin dibine vurulduğu güzel bir örneklerdir.

Diyelim ki, level imizde (oyun esnasında) birden çok kamera arasında geçiş yapmak istiyoruz; SetViewTargetWithBlend ve CameraActor kullanarak her bir kameranın arasında dönebilirsiniz; ve her bir kamera için CameraActor ünde tanımlanmış özellikleri (property) kullanabilirsiniz; örneğin FOV (field of view), açı (angle), post processing effect değerleri vs..

PlayerController, bir Pawn üzerinde kontrole sahip olduğunda (Possess), Pawn ın ViewTarget a dönüştüğü yerde ona set edilebilen bir properti de: bTakeCameraControlWhenPossessed dir.

Örneğin, aralarında geçiş yapabileceğimiz (Pawn formları olan) çoklu karakterlere sahip olalım, ve her biri kendi bakışlarına ayarlı / atanmış kendi CameraComponent lerine ine sahip olsun; bTakeCameraControlWhenPossessed  true propertisi ile aralarında geçiş yapmak için kullanabiliriz; böylece her birinde kullanılan CameraComponent in her birine özel farklı özellik ve ayarları olur.

Spring Arm Component
SpringArmComponent kameraya biraz daha işlevsellik katar. Onu hareketlendirerek görüntüyü daha gerçekçi hale geririr. Buna, bir oyuncunun takip edilmesi esnasında kamera canlanması da diyebiliriz. Farklı bir ifade ile SpringArmComponent olmadan, CameraComponent sürekli sabit bir mesafede ve sabit kalır; yoldaki objelerin ve/veya ona attach lenmiş objelerin potansiyel etkilerini umursamaz.

SpringArmComponent normal koşullarda kamerayı belli bir mesafede tutmaya çalışır, fakat bir collision ile karşılaştığında ve geri koşulduğunda, ya da köşe dönüşleri gibi durumlarda akılcı kamera hamleleri yapar. CameraComponent ile birlikte iyi bir ekip olurlar ve bir karakter için daha gerçekçi bir 3rd person perspective canlanması yaratırlar.

SpringArmComponent in bazı özelliklerine kısaca değinecek olursak :

TargetArmLength  eğer engel olan bir collision yoksa TargetArmLength doğal "spring arm" (kol mesafesi) mesafesidir;
Probe Size, hareket küresinin büyüklüğüdür; collision kontrolü bu büyüklüğe göre hesaplanır; CameraLag, eğer cemara nın ona ataçlanan objeden hafifçe geri kalmasını istiyorsak vs. gibi şeyler de kullanışlıdır.


Light Component
Light Component lerinin farklı tipleri Actor lere alt obje (sub-object) olarak ışık kaynağı ekleme olanağı verir. Hangi Light Component tipini seçtiğinize bakmaksızın, birkaç ortak ışık ayarı vardır, örneğin Light Color (ışık rengi), veya Intensity (ışık yoğunluğu) ve dahası yapabileceğimiz bireysel ayarlar ışık component tipine bakmaksızın ortaktır.

Mesela bir PointLightComponent e Static Mesh i de ilave edecek olan Blueprint e ilave edilebilir; böylece bir tavan lambası fonksyonelliği yaratılabilir.

şimdi bazı ışık tiplerini inceleyelim:

Directional Light Component
DirectionalLightComponent uzaktan, boşluktan gelen sonsuz ışık kaynağını, kısaca gün ışığını simüle eder. Bunun anlamı tüm gölgelerin bu ışık ile paralel olacağıdır; kısa güneş/gün ışığını simüle etmek için kullanılacak olan ışık bu ışıktır.

Point Light Component
PointLightComponent ampul ün işlevine oldukça benzer; tek bir noktadan her yöne eşit miktarda ışık yayar.

Sky Light Component
SkyLightComponent level alanının uzak mesafesini oluşturur; gökyüzü ışığı olarak sahneye etki eder.

Spot Light Component
SpotLightComponent, noktasal bir ışık kaynağından doğrusal bir şekilde dairesel bir alana yansır. Yani doğrudan spot lambaları gibi düşünebiliriz. Vuran alanın koni genişliği, açısı, yoğunluğu, ışık rengi, gölgesi vs. vs.. pek çok ayarı vardır; özellikle flash ışıkları için doğru seçimdir.




Movement Component
Movement Component leri bir Actor veya bir karaktere bir alt obje olarak eklenerek ona hareket (movement) formu sağlar.

Character Movement Component
bir CharacterMovementComponent avatarlara rigid body fiziği kullanmadan yürüme (walking), koşma (running), zıplama (jumping), uçma (flying), ve yüzme (swimming) hareketlerini (moving) yapmamızı sağlar. Chararacter temelli Blueprint yaratılırken bu Component otomatik olarak eklenir. 

Karakterin,

düşüş (falling), 
yürüme sürtünmesi (walking friction),
havadaki veya sudaki hız, veya yerdeki hız,
canlılık (buoyancy),
yerçekimi kaysayısı (gravity scale),
fiziksel güç (physics forces),

vs. dahili değerleri ayarlayan Property ler Fizik objeleri üzerine uygulanabilir. CharacterMovementComponent animasyondan gelen ve dünya içerisinde zaten dönüştürülmüş olan hareket parametrelerini de içerir; ve artık fizik tarafından kullanılmaya hazırdır.


Projectile Movement Component
ProjectileMovementComponent başka bir Componentin pozisyonunu tick fonsyonu içinde değiştirir. Çarpma sonrası sürüklenme ve bir hedefe doğru güdümlenme gibi davranışlar bu tip Component tarafından sağlanır. Normalde hareket eden Actor ün RootComponent idir; fakat başka bir Component de seçilebilir. Eğer güncellenen component in simulate fizik özelliği aktif ise sadece ilk hızı sıfır olmayan başlangıç parametreleri etkilenir ve fizik simülasyonu buradan devralınarak devam eder.



Rotating Movement Component

RotatingMovementComponent belli bir rotation hızında / oranında devam eden dönüş hareketlerin yerine getirir. Dönüş (rotation) opsiyonel olarak belli bir pivot point noktası etrafında olur.

önemli not: hareket anında collision kontrolü uygulanmaz.

RotatingMovementComponent kullanımının bir örneği uçak pervaneleri  veya bir fırıldak olabilir, veya göneş etrafında dönen bir dizi gezegen olabilir, vs..






Navigation Components
Navigation Component leri Unreal Engine sistemi içinde NavMesh (yol bulma) fonksyonalitesini değiştiren veya genişleten Component lerdir.

Nav Modifier Component
Nav Modifier Component kendi kendine birşey yapmaz; fakat Nav Modifier Component,  Root Compont inde (alan teşkil eden) bir temel şekil (shape) component olan bir Actor ün, yine Root Component in NavMesh (yol bulma) yöntemini değiştirecektir.

Bu componentin ters etki yapmadan çoklu kullanımı için her bir Actor sadece bir Nav Modifier Component e sahip olması gerekir.

Dahası bunlar Components tabı altında bulunan hiyerarşinin dışında görünürler, yani başka bir componente child obje olarak atanamadıkları gibi parent de olamazlar.

Bu component ler yasaklı bölgeler tanımlamak için kullanılabilir. Bu yasak bölgeler, üzerinde yürümenin tehlikeli olduğu ve/veya yürümenin bir bedeli olduğu bölgelerdir örneğin: yağlı zemin veya engebeli arazi gibi. Bir noktadan diğerine hareket etmenin toplam bedeli yürüdüğü tüm alanın bedelleri toplamıdır;  elbetteki uygunsuz / yasaklı bölgeden geçmenin bedeli çok daha fazla olacağından NavMesh component en uygun çözüm için her zaman en masrafsız yolu bulur.

Örneğin üzerinde gezinmenin bedeli çok yüksek bir alanımız olsun; ateş yanan çok sıcak bir yüzey veya elektirik verilmiş yol vs.. gibi; ama Pawn ın oradan geçmekten başka çaresi olmasın; bu durumda bedeli mecbur ödeyerek geçecektir; veya geçerken ölecektir. Lakin farklı bir geçiş alanından  yolu uzatarak bile olsa aynı hedefe ulaşmak mümkün ise işte Nav Modifier Component artık Pawn a bu yeni rotayı çizecektir.




Paper 2D Components
Paper 2D Component bir Actor ün alt objesi (sub-object) olarak  2D görüntüleri (sprite) veya görüntü katalogları (Flipbook) yaratmak için kullanılır.

Paper Sprite Component
bir PaperSpriteComponent, tek bir UPaperSprite asset örneği için render ve collision işlerini halleder.

Bu Component, siz Content Browser içinden bir Sprite Asset i bir Blueprint içine veya içinde Sprite Asset içeren bir Actor ü level içine sürüklediğinizde yaratılır.

Bu Component in bir kullanım örneği olarak level in yaratımında kullanılan Sprite Asset lerde olabilir. Örneğin çıkıntılar, platformlar, merdivenler, rampalar vs.. 

Paper Flipbook Component
bir PaperFlipbookComponent bir dizi sprite tir;  başka bir ifade ile 2D animasyon yaratmak için sırasıyla oynayarak akan 2D sprite lerdir. Bir Paper2DCharacter yarattığımızda, bize oynatılabilir anime edilmiş 2D karakter görüntüleri yaratmamızı sağlayan bu component otomatik olarak eklenir.

İsteğe bağlı olarak PaperFlipbookComponent leri 3D görüntü içinde, veya ataçlandığı diğer Componentler içinde veya ona ataçlanan componentler içinde oynayabilir. bu componentin pek çok metodu ile onların oynama hızını da kontrol edebiliriz, döngüsünü vs..




Physics Components
Physics Component leri çeşitli yollarla level imizde fizik etkileri için kullanılan objelerdir; diğer objelere bu yönü ile etki ederler.

Destructible (yokedilebilir) Component
DestructibleComponent yokedilebilir Actor yaratmak içindir. Bu component bir alt obje (sub-object) olarak eklendiğinde, onu kullanmak için bir de Destructible (yokedilebilir) Mesh belirtmek zorundayız. Kırılma / çatlama / pğatlama efektleri için varolan asset leri kullanmak yerine eğer istersek kendimizinkileri de belirtebiliriz.


Physics Constraint Component
bir PhysicsConstraintComponent iki rigid body yi bir araya getirmemizi sağlayan bir ek yeridir. bu componentin çeşitli parametreleri ile farklı tiplerde ekler yaratabiliriz.

bir PhysicsConstraintComponent ve iki de StaticMeshComponent ile, sarkan objeler yaratabiliriz, lastik salıncak, ağır bir çanta, veya tabela gibi...   Dünya (world) içinde gerçeğe daha yakın fizik tepkileri vererek oyuncuların kendisi ile etkileşebileceği durumlar yaratabileceğimiz bir Component tir.


Physics Handle Component bir PhysicsHandleComponent bir eşyayı kapma / yakalama ve etrafta hareket ettirme objesidir. Taaaki objeyi tuttuğumuz sürece kullanılmaya devam eder. Bir örnek ile açıklamak gerekirse, alınabilen (pick-up) ve/veya bırakılabilen objeler bu componentin kullanımına örnek olabilir.  Gerekirse  "gravity gun"  formu gibi de kullanılabilir.

Physics Thruster Component
Thruster kelime anlamı olarak  "itici" anlamına geliyor. Bir PhysicsThrusterComponent eksi X doğrultusunda özel bir güç uygulayabilecek fiziğe sahip objeler ile birlikte kullanılır. Burada X noktası baskı uygulanacak yönün notasıdır. Burada baskı / itiş gücü sürekli uygulanır. Bu güç otomatik olarak aktive veya deaktive edilebilir ve aktivasyon script ile kontrol edilebilir. İtiş gücü kullanımına örnek bir roket düzeneği olabilir; bu component ile rokete süresiz güç uygulanır ki böylece roket ileri doğru gider. Tabi bu itiş gücü pozisyonu roketin altında olduğu sürece geçerlidir. Bu component Blocking Volumes kullanır, böylece itişe tesir eden hareket içerir.

Radial Force Component
bir RadialForceComponent radial güç yaymak için kullanılır veya fizik objeleri etkileyebilen veya yokedilebilir objeler dürtüsü vermek için kullanılır. PhysicsThrusterComponent den farklı olarak bu tip componentler “fire-and-forget” ateşle ve unut güç tipini uygular ve sürekli değildirler.

bu componenti yok olan bir obje nin kırık parçalarını dağıtma gücü olarak da kullanabilirsiniz; örneğin bi patlama gibi. RadialForceComponent kullanımı güç ve yön belirtmek içindir, bir obje yokolduğunda parçaları dışarı doğru parçalı bir şekilde “push” edebiliriz. Bir merkezden her tarafa dağılan bomba itiş gücü gibi...



Rendering Components
  • Atmospheric Fog Component 
  • Exponential Height Fog Component 
  • Billboard Component 
  • Material Billboard Component 
  • Cable Component 
  • Custom Mesh Component 
  • Poseable Mesh Component 
  • Decal Component 
  • Instanced Static Mesh Component 
  • Particle System Component 
  • Post Process Component 
  • Scene Capture 2D Component 
  • Scene Capture Cube Component 
  • Spline Mesh Component 
  • Text Render Component 
  • Vector Field Component



Atmospheric Fog Component
bir AtmosphericFogComponent leri duman etkisi yaratmak için kullanılır, örneğin bulutlar, veya level içindeki ambians dumanı gibi.. bu componentin level içindeki etkisini oluşturan bir kaç ayarı vardır: örneğin sis yoğunluğu, yüksekliği gibi..  düşük değerlerde sis yoğun kalın görünür, yükseklik arttıkça sis ortaya saçılır, yani yoğunluğu azalır.



Exponential Height Fog Component
bir ExponentialHeightFogComponent sis etkisi yaratmak için kullanılır ama bunu biraz ortam sisi olarak düşünmek gerekiyor, en güzel örnek hava kirliliği gibi düşünmek olabilir.

Exponential Height Fog, haritanın daha düşük zeminlerde sis yaratır ve yüksek yerlerde daha az yoğunluğa sahiptir. Geçiş yumuşaktır, böylece yükseldikçe hiçbir zaman ani bir düşüş olmaz. Exponential Height Fog iki sis rengi de sağlar: biri dominant directional light a bakan yarım küre içindir, diğer renk ise karşıt yarım küre için.

Billboard Component
bir BillboardComponent daima kameraya bakacak şekilde render edilen bir 2D texture dir ve ArrowComponent gibi fonksyonalite gösterir. Kolay seçim yaptırma yöntemi olarak kullanılır. BillboardComponent gerçek dinamik sis effect scripti ile yaratılan bir material e oturtulur ki böylece oyun görüntüsü ile nispeten ayrışan bir sayfa/pencere açabiliriz.

Material Billboard Component
bir MaterialBillboardComponent daima kameraya dönük render edilen bir 2D material dir. Bu componentin nerede kullanılabileceğine bir bir örnek: 2D çimen ve yeşilliklerdir.

büyüyen çim ceplerini veya çim yapraklarını dahi temsil etmek için Static Mesh kullanmak yerine çimelere iletmek için kullanılan bir material ile birlikte MaterialBillboardComponent kullanımı; çimenlerin billboard da görünmesi için 3D representation (temsile) gerek yoktur, bu oyuncuya 3 boyutlu görünüm ilüzyonu verecektir.


Cable Component
bir CableComponent bize iki componentin aralarında bir kablo render ederken birbirini attach etmemizi de sağlar. Kablonun üzerine materyal tanımlayabiliriz ve kablonun nasıl görüneceğini etkileyen özellikleri de parametreler ile verebiliriz.

bu tip bir Componentin kullanımına bir örnek olarak, bir ip veya karakterin döndüreceği bir hortum vs. olabilir; ve sabitlenmiş bir nokta / lokasyon dan diğer bir oyuncuya (script aracılığı ile) ataçh lananrak, karakter ipi salabilir, bükebilir vs. Örneğin bir first person karakteri, silahından bir kablo çıkarabilir ve onu çarpışma lokasyonuna ataç layabilir; bir tür yakalama silahı "grappling gun" gibi.

Elbette bunu çok basit görsel elemenler elde etmek için de kullanabiliriz; mesela sadece bir çizgi temsil etmesi için de kullanabiliriz; ya da başka bir objeye bağlanmak gibi işler için de.


Custom Mesh Component
bir CustomMeshComponent bize özel üçgen mesh geometrisi belirtmemize olanak tanır. Daha çok yeryüzü şekilleri ve taban yaratmak için uygun.


Poseable Mesh Component
bir PoseableMeshComponent bize blueprint tarafından yönetilen kemik geçişleri yapmamıza olanak tanır.


Decal Component
bir DecalComponent mesh yüzeyi üzerinde render edilen bir materialdir. Bir model için bir tür yapışkan kağıt resmi (sticker) gibi de düşünülebilir. Decals (çıkartmalar) pek çok amaç için kullanılabilir; örneğin kurşun çarpma çıkartması ateş edildiğinde duvar üzerinde olabilir; veya bir araba patinaj yapıldığında yolda izi çıkabilir; veya ateş edildiğinde kan saçılması vs..



Instanced Static Mesh Component
bir InstancedStaticMeshComponent aynı static mesh in çoklu instance larını verimli bir biçimde render eden bir componenttir. Bu component tipi özellikle, "procedural level" ler, veya procedural oda yaratımları için kullanışlıdır. Level içindeki yüzlerce ve hatta binlerce Static Mesh Actor yerine level içine bir tane Instanced Static Mesh yerleştiririz ve onun çoklu örneğini eklemesini isteriz; zemin veya duvarlar gibi örneğin; bu bize performans olarak döner. Ayrıca InstancedStaticMesh Component ler ve prosedurel üretimler, rastgelelikler sağlayabilir.



Particle System Component
bir ParticleSystemComponent bize parçacıklı yansıma / yayma / emit etme alt objesini (sub-object) başka bir objeye ekleyebilmemize olanak tanır. bir ParticleSystemComponent eklemek birkaç nedenden ötürü kullanılabilir; yok olan birş eyin patlama effekt ine eklenen ateş effekti gibi şeyler vs..

bu tip bir componenti ekleyerek script vasıtası ile oyun esnasında (gameplay) erişebilir ve parçacık etkisinin tüm parametrelerini ayarlayabiliriz.

Örnek olarak aşağıda bir güvenlik kameramız var ve kıvılcım effecti (spark effect) i için ParticleSystemComponent ekledik.

particle1.png

particle2.png

Post Process Component
PostProcessComponet leri Post Process kontrollerini blueprint için aktive eder. Kullanılabilir olduğunda da volume datası sağlaması için bir parent UShapeComponent kullanır. bu component tipi uygulandığında Post Process Settings ölçülerinde level tonlamasını değiştirmek için kullanılır. örneğin default post process ayarları ile oynuyoruz diyelim, bir oyuncu hasar aldığında veya öldüğünde atıyorum, script ile bu ayarı siyaha çalan şekilde değiştirebiliriz veya beyaza çalarak sahne rengi ile oynayabiliriz.



Scene Capture 2D Component
bir SceneCapture2DComponent, sahneden görüntü yakalamak için kullanılır; "snapshot", tek bir düzlemden yakalanır ve istenen hedefe render edilebilir.

Capture edilirken Field of View (FOV) controlü için ayarlar vardır; dahası bir Render Target texture belirmek için bazı başka ayarlar da vardır. Bunun kullanımına bir örnek olarak bir ayna olabilir; aşağıdaki resimde olduğu gibi, security camerası bir monitör üzerinde görünüyor.

2dRender.png
Burada SceneCapture2DComponent ile birlikte bir Blueprint yarattık ve ona level içinde bir geometri parçasına uygulanmış bir material olarak kullanılacak bir Render Target texture atadık.




Scene Capture Cube Component
bir SceneCaptureCubeComponent, altı düzlemden (plane) sahnenin bir "snapshot" unu yakalamak için kullanılır ve onu bir render target a besler.

Reflections_1_6_Header.png
SceneCapture2DComponent örnekleri (instance) çoğunlukla çoğu sahnenin capturing ihtiyaçlarını yerine getirmelidir; fakat farkında olmalıyız ki bu çok pahalı (expensive) performans yöntemidir ve sadece çok gerektiğinde kullanılmalıdır.


Spline Mesh Component
bir SplineMeshComponents bir Static Mesh asset ini bükmek ve uzakmak / çekmek için kullanılabilir. SplineMeshesComponents ile çalışırken pozisyon için ve teğet için vector ler sağlamalıyız ki şerit başlangıç ve bitiş boktasını belirtebilelim. Aşağıdaki SplineMeshComponent bir Blueprint e eklenmiş ve boru Static Mesh i etkilenmek üzere bir asset olarak atanmış.

splinemesh.png
componentin kendisi üzerinde poziston ve teğet için vektör ler belirttiğiniz esnada bunları değişkenler olarak set etmek için script kullanabilirsiniz ve onları public yapaiblirsiniz böylece editör içinde edit edilebilir ve Viewport içinde görünebilirler.

splinemesh2.png
dilediğimiz bize izin verilen genişleme (strech) ve dönme ve hareketinden bağımsız olarak, Actor ün tümü boyunca Start Transform ve End Transform da hareket edebiliriz.



Text Render Component
bir TextRenderComponent dünya içinde verilen fontta metin render eder. İlişkili metin özellikleri desteklenir, örneğin: Scele, Alignment, Color, vs. bu componenti bir oyuncuya level ile etkileşebilen bir objeyi işaret etmek için kullanabilirsiniz mesela; level de oyuncunun ona yaklaştığında bir tuşa basılarak oturabileceği bir sandalyemiz var diyelim; hemen ilgili talimatı (instructions) içeren bir TextRenderComponent ekleriz; bu talimat oturması için ne yapması gerektiği üzerine yazmalıdır; örneğimizde, ve visibility özelliğini önce off olarak ayarlarız; sonra bir BoxComponent i trigger olarak kullanabiliriz, box boyunca temas eden, box içine giren, trigger i tetikler, aşağıdaki gibi,

text1.png
oyunda oyuncu trigger a girdiğinde, TextRenderComponent oyuncuya nasıl oturacağı bilgisini görüntülesin.

text2.png

Vector Field Component
bir VectorFieldComponent GPU sprite lerinin hızını veya hızlandırılmasını belirleyen, bir hız vektörleri gridi içeren, bir 3D kap vektör alanı referanse etmek (belirtmek) için kullanılır.

Vector alanları (Vector Fields) ani rüzgarlar gibi particle effectleri için kullanılabilen küçük scale effectleri yaratmak için kullanılabilir.

image050.png



Shape Components

yönlendirme belirtenveya yol gösteren Shape Component ler, bir collision yaratmak için kullanılabilir, veya diğer objelerin etrafında trigger yaratmak için kullanılabilir.

Arrow Component
ArrowComponent bir çizgi kullanarak basit bir ok render eder; bu, bir objenin nereye bakması gerektiğini göstermesi açısıdan kullanışlıdır. aşağıdaki örnekte görüldüğü gibi ekrandaki kırmızı ok (arrow) kapının hangi yöne açılacağını gösteriyor.

arrow_component.png
Ok (hidden özelliği kaldırılmazsa) güncel halde ekranda görünmeyecektir. Büyüklük ve rengi isteğe göre ayarlanabilir. Bu component, herhangi bir collision a sahip değildir ve potansiyel olarak script kodlarımız için bir marker (işaretleme) olarak da kullanılabilir; örneğin bir CharacterBlueprint e, karakterin omzuna bir ArrowComponent ekleyerek, karakter bir buttona bastığı anda CameraComponent ArrowComponent in lokasyonuna doğru hareket ederken bir omuz üstü stilinde kamera yaratılır vs..

Box Component
bir BoxComponent genellikle basit collision yaratmak için kullanılır, aynı zamanda aşağıdaki örnekte görüldüğü gibi trigger olarak da kullanılabilir.

box_trigger.png
bir BoxComponent ateşin particle effectinin etrafına onun collision ayarlarında Generate Overlap Events ile ekleniyor; bir şey bu kutuya overlap olduğunda  bir olay (event) ateşlenecek ve bu ateşe overlap olan actor e hasar vermek üzere uygulanmış olan script çalışacaktır.

Capsule Component
CapsuleComponent basit bir collision veya trigger yaratmak için kullanılan bir kapsül şeklidir.

capsule_component.png
yeni bir character Bleprnit i yaratıldığında yukarıdaki CapsuleComponent otomatik olarak eklenir, ve bu karakter için collision ayarları sağlanır; böylece karakter dünya içindeki diğer objeler ile kesişir.

Meydana geldiklerinde script ler ile programlamamıza izin vermek için CapsuleComponent Overlap ve Hit event lerini de üretir.


Sphere Component
SphereComponent leri collision amacıyla kullanılan küresel şekillerdir örneğin projectile çevresini collision yapmak için; aşağıda göründüğü gibi.
sphere_component.png
tıpkı Box ve Capsule component lerinde olduğu gibi ihtiyacımız olan collision fonksyonalite tipini yaratmak için ayarlama yapabiliriz.



Spline Component (şerit komponenti)
bir SplineComponent sokakları yapmak için veya diğer componentlerin takip edebileceği karmaşık (complex) yollar yapmak için kullanılabilir. Aşağıda bir spline (şeri) tarafından yaratılmış bir path i izleyen Particle System e sahip olmak amacı ile blueprint e eklenmiş bir SplineComponent, BillboardComponent ve ParticleSystemComponent mevcut.

spline_component.png
Viewport içinde SplineComponent i içeren actor e sağ tıklayarak spline i edit edelim.


bu, spline şeride noklar ekler gibi veya kullanmak için spline şerit noktası tipi tanımlar gibi options değerleri ile birlikte bir context menü getirecek.

aşağıda Unreal Engine logo nun dış çizgileri ni temsil eden şekil tarafından yaratılmış bir PATH var.

spline_component2.png
biraz blueprint sağlayarak particle effectin lokasyonu güncellenebilir, sonuç aşağıdaki gibi olacaktır:

spline_component4.png



Skeletal Mesh Component leri
Skeletal Mesh component bir iskelet kullanarak karmaşık animasyon datası ve bir iskelet kullanmak içindir.

SkeletalMeshComponent SkeletalMeshComponent ler USkeletalMesh in instance i yaratılarak kullanılır. Skeletal Mesh görünüm olarak birbirine köşe (vertice) noktaları ile bağlı eklemler ile bağlı kemiklerden oluşur.

bu da skeletal mesh leri karakterler, yaratıklar, karmaşık makineler, veya karmaşık hareketli görünüme ihtiyaç duyan herhangi şey için ideal yapar.

mesh_component.png
yukarıda character blueprint i tarafından oynayabilen bir karakter yaratmak amacı ile kullanılan bir SkeletalMeshComponent var.



Static Mesh Component
Static Mesh componentleri başka actor lere akt obje (sub-object) olarak eklenilerek bir geometri parçası olarak kullanılabilir.

StaticMeshComponent UStaticMesh in instance i yaratılarak kullanılır. Bir static mesh, sabitleşmiş static poligonlar setidir; bir geometri parçasıdır, Unreal Engine içinde, level için world geometrisi yaratmak amacı ile kullanılan temel uniteler StaticMeshComponent lerdir.

Kapılar, asansörler, rigid body fizik objeleri, yeşillikler, yeryüzü dekor şekilleri, gibi hareketli objeleri parametrik (procedurally) yapıları, oyun hedef objelerini, ve ila sayısız görsel elementi yaratmak için kullanılabilir.

aşağıda lambayı temsil eden bir StaticMeshComponent var ve ucunda da boylu boyunca ışıyacak olan bir SpotLightComponent , ve de alarm olarak kullanılmak üzere bir PointLightComponent var.

static_mesh.png
başka bir örnek de, kapı formu içindeki yanyana iki StaticMeshComponent tir. Script ile birini veya ikisini birden hareket ettirebiliriz.

static_mesh2.png



Utility Components
Application Lifecycle Component
ApplicationLifecycleComponent işletim sisteminden uygulamanın durumu hakkında bilgi alımı sağlar örneğin: activated, syspended, termination vs..

Child Actor Component

ChildActorComponent kaydolduğunda bir Actor ü spawn eden componenttir, unregister olduğunda ise yokeder (destroy).

Scene Component
SceneComponent bir transform bilgisine sahiptir ve attachment i de destekler; ama render veya collision yeteneğine sahip değildir! diğer komponentleri dengelemek adına bunu bir kukla "dummy" component olarak kullanmak kullanışlıdır.



Widget Component 
Unreal Motion Graphics ler ile yaratılan Widget Component ler, 3D UI elementleri göstermemize olanak verir.

Widget Component in kendisi game world ile etkileşime geçebilen bir bir 3D widget Blueprint örneğidir.

Aşağıdaki örnekte , biz şimdi “widget class blueprint” i belirtmemize/seçmemize olanak veren bir Widget Component ekledik.

UMG_3D_21.png

Oyun dünyası (world), içinde örnek etkilşimti (interactive) menü göstermek için Widget Blueprint kullanır. WidgetComponent in dünyadaki büyüklüğünü (Draw Size) veya (Draw at Desired Size) değerlerini değiştirerek ayarlayabilirsiniz.
UMG_3D_22.png
levelimizde bir kez WidgetComponent içeren bir Actor yerleştirdiğimizde , Widget Class Blueprint world içinde görüntülenir.
UMG_3D_30.png

Widget Component özellikleri (property):

Space
widgeti render eden boşluk kordinatı (World or Screen). Widget dünya içinde bir mesh olarak render edilir.

Widget Class
kullanıcı Widget class ı, örneğini (instance) yaratmak ve göstermek için.

Draw Size
gösterilecek dörtgen in büyüklüğü.

Manually Redraw
Widget in yeniden render edilmeyi beklemesi veya o anki hali ile görüntülenmesi.

Redraw Time
çizimler arasındaki süre, eğer sıfır ise her frame de yeniden çizilir. Eğer 1 ise her bir saniyede yeniden çizilir (redraw). Bu manual redraw ile de çalışacak. Dolayısı ile manuel redraw diyebiliriz, ama sadece maksimum hızdaki (rate) redraw.

Window Focusable
Is the virtual window created to host the widget focusable? Should this take focus from the user.

Draw at Desired Size
Widget Class tarafından belirtilen otomatik ayarlanmış büyüklük te render edilmesine neden olur. şayet her bir frame de yapılırsa pahalıdır (performans açısından).

Pivot
widget in konumlanma ve posizyonunun neye göre göreceli olacağı, pivot noktası.





evet,
component tanımını ve yaygın kullanılan bazı component leri çok kısa ve de teorik olarak da olsa incelemeye çalıştık. Aslında buna kabaca incelemek bile denemez; sadece kulağa biraz kar suyu kaçırmak diyelim; maksat kabaca da olsa teoride ne olduklarını biliyor olmak ki; böylece pratik örnekleri daha iyi anlayabilelim.

Tanmlamaları yaparken yeterince iyi ifade edemediğim için kusura bakmayın; öncelikle ben de her detayı elbette bilmiyorum; ve bazı dökümanların dili o kadar kötü ki, ABD ye gidipte iş bulamayan bir göçmen tarafından yazılmış olduğunu düşündürüyor bana :)

ve en önemlisi de burasını kendi özel not defterim olarak kullanıyorum. Belki birileri faydalanır diye de notlarımı internete açıyorum o kadar.

inşallah çok daha güzel ve de doyurucu yazılarda görüşmek üzere, hoşçakalın,

1 yorum:

Adsız dedi ki...

Teşekkürler, Elinize sağlık