UE4 / C++

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

15 Ağustos 2020 Cumartesi

Content Browser - Asset - Paket (Chunk) - 1

UE4 Projeler


UE4 için bir "proje" demek, tüm içeriği (content) ve kodu barındıran kendi kendine yeten bir ünite demektir. 

bir proje, belli bir folder (dizin) organizasyonunda gruplanarak kaydedilmiş dosyalardan oluşur.

Örneğin aşağıdaki resimde proje dizini içinde Content Browser in hiyerarşik dizin yapısı görülmektedir:



yukarıdaki resim projenin Content / StarterContent  dizin yapısı.


.uproject 
Projemizin Root  klasöründe ise proje ile aynı adı taşıyan,  tüm projeyi simgeleyen .uproject  adında bir dosya görünür; 

bir  .uproject dosyasında o projedeki tüm dosyalar ve dizinlerin kaydı ve ila proje hakkında detaylı bilgiler tutulur.

Siz bir dosyayı açarken, kaydederken veya yeni bir dosya yaratırken de yine  .uproject  in referansı (sağladığı bilgileri) kullanılır. 

.uproject bir anlamda bir referans dosyasıdır, varlıkların (assets), dosya ve klasörlerin tüm yerlerinin detaylı bilgisi buradadır; buradan ilgili bilgi okunarak tüm o varlıklara erişim yapılır.

Paralel olarak bakımı ve geliştirilmesi mümkün olan çok sayıda farklı Proje oluşturabilirsiniz. Hem Motor (hem de Editör) aralarında kolayca geçiş yapabilir; bu da aynı anda birden fazla oyun üzerinde çalışmanıza veya ana oyun Projenize ek olarak birkaç test projesine sahip olmanızı sağlar; yani UE4 de aynı anda çok sayıda farklı / ayrık proje yaratabilirsiniz. Hepsi de kendi ayrı proje dizinine ve kendi ayrı içerik dosyalarına sahip olur.

UE4 editörü projeleriniz arasında kolayca geçiş yapabilir. Böylece birden fazla projede tek seferde çalışabilirsiniz.


Asset lerin İsmini Değiştime ve Taşıma
asset in ismini değiştirme işini content browser sağ tık ile açılan context menü den "Rename" diyerek veya doğrudan F2 ye basarak yapabiliriz.

asset ler yine content browser üzerinden önce seçilip, sonra mouse ile sürüklenerek başka folder lara taşınabilir veya kopyalanabilir.

asset lerin isimleri bu şekilde değiştirildiğinde veya taşındığında onları referans etmiş olan diğer Asset ler de uygun şekilde güncellenirler; 

işlem gören Asset in olduğu yere görünmez bir yönlendirici (Redirector) konur;

yönlendiriciler (redirectors) Content Brwser a sağ tıklanıp "Fix Up Redirectors in Folder" denilerek temizlenebilir;

bu işlem, bu yönlendiriciye (redirector) referans etmiş olan tüm Asset leri doğrudan yeni konumdaki Asset e işaret etmelerini sağlayacak ve ardından yönlendiriciyi (redirector) kaldıracaktır; tabi Asset lerin yenien kaydedilmesi gerektiğini unutmayın.



Content Browser in Source Panel i içinde bir folder a ya da herhangi bir yere sağ tıklamak “Fix Up Redirectors” seçeneğine erişmemizi sağlayacaktır.

sonuç olarak yineleyelim ki Asset leri taşıma (moving) ya da isim değiştirme (renaming) işlemleri content browser içinde yapılmalıdır.


eğer bir asset işletim sisteminin file explorer penceresinden taşınır (moved), silinir (deleted), veya yeniden isimlendirilir (renamed) ise etkilenen asset in referansı artık onu bulmada başarısız olacaktır; o asset halen projede olsa bile...



Asset Dosyaları

bir Asset, UE4 projesi için bir parça "içerik" demektir, 

ve bir dosyaya serileştirilmiş (binary data olarak yazılmış) bir UObject olarak düşünülebilir.

Asset listeleri Content Browser içinde organize bir ağaç (tree) yapısı olarak düzenlenmiştir; 
ve herhangi bir dizin içine bakarsak, Asset ler ve (muhtemelen) yine alt dizinler (subfolders) görürüz.

önemli olan nokta şu, dizinlerde göreceğimiz bu Asset lerin her biri ".uasset" uzantılı birer dosya olarak karşımıza gelir; yani her Asset bir .uasset dosyası olarak tutulur. 

İçerikler arasında sadece harita (map), yani level ler bir istisna olarak  .umap uzantılı dosyalarda saklanır; ama (Content Browser da göreceğimiz) diğer tüm içerikler tipi ne olursa olsun bir .uasset uzantısındadır;

yani level ler .umap, diğer tüm assetler .uasset


önemli başka bir nokta ise bu Asset lerin (.uasset dosyalarının) UE4 editörü dışında, işletim sistemi pencerelerinde kopyalanması / taşınması hatalara neden olur; çünkü bu şekilde onların referansları, yani onları kullanan diğer object lerin kullandığı path yolları bozulmuş olur. 

burada Asset referanları dediğimiz şey Asset in full path i bilgisini içerdiğinden ve eğer bir Asset i bu şekilde (pencerelerden) taşırsanız, onun path i değişir, ama UE4 sistemi içindeki kayıtlı path i değişmediğinden bu artık hatalı bir durumdur. 

Bu yüzden tüm bu kopyalama taşıma silme işlemlerinin Content Browser içinden yapılması gerekir. Çünkü Content Browser her bir işlem ile birlikte asset lerin içindeki (referans path lerini de içeren) Meta Data bilgilerini de sürekli olarak günceller.

Yine sadece level, yani .umap uzantılı dosyalar ise bu kısıtlamadan etkilenmezler.


Asset isimlendirme
bir Asset i editörümüze import ettiğinizde veya doğrudan yarattığınızda, Asset kullanıcı tarafından isimlendirilir.

örneğin,

Content/Characters/MyCharacter 

yolundaki bir asset şu şekilde kaydedilecektir:

/UE4/MyProject/Content/Characters/MyCharacter.MyCharacter.uasset


Asset in path i (yolu), import edildiği veya yaratıldığı folder dan otomatik olarak alınır; bu projenin disk üzerindeki yoluna göre farklılık gösterebilir; örneğin content browser da 

Content/Characters/MyCharacter 

bu yolda yaratılan bir asset in path i :

/UE4/MyProject/Content/Characters/MyCharacter.MyCharacter.uasset

olabilir.


Asset Yönetimi (Asset Management)
Oyun esnasında (runtime) asset ler genellikle motor tarafından otomatik olarak yüklenir (loaded) ve hafızadan silinir (unloaded).

fakat, süreçler üzerinde direkt kontrolü alarak kayda değer performans artışları sağlayabilecek durumlar vardır; örneğin gereksiz yükleme sürelerinin azaltılması veya tamamen ortadan kaldırılması, oyun sırasında aksama / donmaların giderilmesi gibi…

bir proje tamamlandığında ve dağıtım, yani deployment aşamasına gelindiğinde asset ler cooking işleminde geçirilir yani asset ler asset tiplerine ve hedef platforma göre binary, yani ikili dosya formatına dönüşrürülür; ve birden çok .pak dosyasına bölünebilir. 

bu oldukça detaylı bir konu; burada teorik özetler ile geçiştiriyoruz..

Kaynak Kontrolü Çakışmalarını En Aza İndirme:

tek bir iş akışı için her biri birkaç asset içeren paketler kullanıldığında, bu kaynak kontrolü çakışmasına sebebiyet verebilir;

bunun yerine çok sayıda bireysel asset dosyası yaratmayı destekleyen ve teşvik eden bir iş akışı her bir asset in kendini bağımsız şekilde denetleyebilmesi anlamına gelir;

bu, kaynak kontrolü çekişmesini ve iş akışındaki darboğazları azaltır;

ayrıca, içerik yönetim sistemlerinin (content management systems) senkronizasyon süresi, tekil / bireysel Asset dosyalarında birden çok Asset içeren paket dosyalarına göre daha hızlıdır; çünkü tek bir Asset deki değişiklik yalnızca bir dosya güncellemesi gerektirir;

Unreal Editörü içinde Asset lerin her biri genellikle tek bir Asset içeren .uasset dosyalarında depolanır;

her asset referansı oyundaki herhangi bir asset i benzersiz olarak tanımlayan dizin tarzında bir path içerir;

Asset ler Content Browser içinde yaratılır veya content browser içinde dışarıdan import edilir;


Asset Referansları

bir asset referansının ne olduğunu anlamak için, Content Browser içinden bir asset e sağ tıklayıp Copy Reference dediğimizde hafızaya ne aldığına bakalım:



StaticMesh'/Game/Geometry/Meshes/1M_Cube_Chamfer.1M_Cube_Chamfer'

yani Asset in tipi (burada Static Mesh) ve gerektiğinde bulunabileceği konumu olarak görünüyor. 

Tam fiziksel yolu ise bundan biraz daha farklı birşey, şöyleki bir alttaki Copy File Path seçildiğinde hafızaya aldığı şeyin: 

C:/Users/user/Documents/Unreal Projects/testCpp12/Content/Geometry/Meshes/1M_Cube_Chamfer.uasset

bilgisayardaki tam fiziksel yolu olduğu görünüyor. 

Oysaki referans dan bahsederken onu herhangi bir bilgisayardan bağımsız, UE4 ün her zaman bulabileceği asset bilgilerini sembolize ettiğini görebiliriz.

Peki bir asset in başka bir asset i referansta bulunması nedir?
bir asset in başka bir asset i kullanmasıdır; 
ona ihtiyacı olması, yani artık ona bağımlı olması (dependency) dir.

ve Content Browser içinde asset ler kullanıldıkça asset lerin birbirine olan bağımlılıkları giderek artar, ve editör de bu durumu sıkı takip etmek için her biri için bir referans listesi oluşturur;

ve bu referanslarla nasıl çalışacağımızı bilmek önemlidir..

eğer ki bir asset i silemiyor veya başka bir dizine taşıyamıyorsanız, o asset başka bir object tarafından referans edilmiş yani bir şekilde kullanılmış demektir.

Silme İşlemi:
mesela editör ortmından bir asset i silmek çok kolaydır; silmek istediğiniz asset e mouse ile sağ tıklarsınız ve context menüden "Delete" dersiniz:




bu talep, silme işlemini onaylamanızı isteyen bir penceresini önünüze getirir:



eğer zaten level içinde kullanılan bir asset i silmeye kalkarsanız,, veyahutta, diğer asset lerden silmeye çalıştığımız asset i kullanan (ona bağımlılığı olan) veya onu referans eden var ise, silme işlemini engellemek için bir uyarı penceresi bizi karşılar:




burada soldaki kırmızı button (Replace References) a basarak aynı tipte başka bir asset seçip yerine onun referansını koyabiliriz, veya doğrudan sağdaki button ile (Force Delete) diyip silmeye zorlayabiliriz; ama bunu yaparsak projemizde içi boş asset referansları kalır. Yani falanca asset in adı ve yolu geçiyor ama ortada öyle bir asset yok. Runtime anında bu malumunuz çakılmalara sebebiyet verecektir. 

Bu gibi araçlar bu referans takiplerini kolayca yapmamızı ve bu referans bağlantılarını kaldırabilmemize yardımcı olurlar.


Content Browser içinde bir asset e mouse ile sağ tıkladığımızda açılan context menü de "References" kısmı vardır, burada bir asset in konumuyla ilgili iki yardımcı komut görülebilir:


bunlardan biri az önce yukarıda anlatılan "Copy Reference", diğer ise hemen yukarıdaki resimde zaten seçili olan ve yine daha önce sözü edilen "Copy File Path"  dir.


"Copy Reference" komutu seçili asset in referanslarını clipboard a kopyalar; bu, bir asset in path ini metinsel olarak elde etmek istediğimiz zaman, veya bir dış listeye ihtiyaç duyduğumuz zaman faydalıdır. Oyun içerisindeki programlamalarda buradaki path i kullanırız; çünkü buradaki path evrensel bir path dir. 

"Copy File Path"  ise gerçek fiziksel yani iştetim sisteminin o asset i tam oalrak nere de tuttuğunu bilmek istersen yine bu bilgiyi clipboard a kopyalar. Bu bilgi bilgisayardan bilgisayara farkedebilir. Evrensel değildir. 


Referanslar konusunda başka güzel bir araç ise

"Reference Viewer"  aracı (tool) dır,



bu araç, seçili olan asset in referanslarını, yani o asset in kullandığı diğer assset leri ve de onu kullanan (referans etmiş olan) diğer asset leri görüntüler; 

bu komut bir dizine sağ tıklanarak toplu halde de uygulanabilir; yani o folder içindeki asset ler nerelerde kullanılmış ? başka hangi object ler bu folderdaki asset leri çağırmış (refere etmiş); toplamda ne kadar hafıza tüketmiş sorularına yanıt verir. 

Reference Viewer


burada bir numaralı kısım asset imizi referans eden (onu kullanan) diğer asset lerdir;

iki numaralı kısım bizim asset tir, bilgilerine baktığımız asset;

üç numaralı kısım ise bizim asset tarafından referans edilmiş (kullanılmış) diğer asset lerdir.

saü üst köşede şunun gibi ayar seçenekleri vardır:

Search Options

Search Depth Limit
Motorun referansları arayacağı derinlik. Örneğin, 2 değeri, grafiğin yalnızca seçili asset ile ilgili asset leri değil,, aynı zamanda ilgili asset ler ile ilgili varlıkları da (!) görüntüleyeceği anlamına gelir.


Search Breadth Limit
Belirli bir sütunda listelenen referans sayısı (referans veya referans alan). Örneğin, bir asset 20 öğeye referansta bulunuyorsa, ancak Arama Genişliği Sınırının değeri 10 olarak ayarlanmışsa, bu sütunda yalnızca 10 öğe görüntülenir.



bunların dışında, 
Content Browser a sağ mouse ile tıklarsak açılan context menüsü içinde:

New Asset
yaratılabilecek asset lerin bir listesini görüntüleyen bir alt menü açar,

Show in Explorer 
sağ tıkladığınız alanın gerçek fiziksel yolunu gösteren windows penceresini açar.

Rename
öğenin adını değiştirme

Set Color 
dizine özel (organizasyonel amacınıza uygun) bir renk vermek isterseniz diye, böylece işlemlerinizi daha iyi organize eder ve aradığınızı daha kolay bulur karmaşayı azaltabilirsiniz. 

Save All 
Tüm yeni veya değiştirilmiş Asset leri ve tüm yeni klasörleri kaydeder. Değişiklik yaparken bunu sık sık yapmayı unutmayın.

Delete
ilgili klasörü ve tüm içeriğini siler


Size Map
o folderdaki asset ler ve referans ettikleri herşey tarafından kullanılan yaklaşık hafıza (memory) nın interaktif (etkileşimli) haritasını verir; komut tek bir asset e de uygulanabilir.