Eğer bir oyun yapma hedefiniz varsa öğrenmemiz gereken temel bileşenlerden biride “Camera” objesidir. Hem oyunumuzu istediğimiz bakış açısından, genişlikten gösterebilmek hem de oyun performansını optimize etmek için kamera ayarlarına oldukça hakim olmamız gerekiyor.
Bu sebeple yazımızda oldukça detaylara girerek “occlusion culling” ve “frustum culling” konularında değineceğim. Ama önce “Camera” objesinin “Inspector” alanını tek tek inceleyelim.
Unity Kamera Ayarları
Inspector alanına dikkat ettiyseniz bilediğimiz birçok özellik var ama merak etmeyin hepsine tek tek değineceğim.

Clear Flags Seçeneği
Oyun çalıştıktan sonra kamera yeni bir frame geçişi yaptığında, oyundaki görüntüyü yeni bir sahne üzerine tekrar atar. Burada yeni frame deki görüntüyü nasıl işleyeceğini seçebiliyoruz.
4 farklı alt seçeneği bulunmaktadır ve varsayılan olarak “Skybox” seçili gelir.

Skybox: Varsayılan “Skybox” görüntüsünü yani ilk ekranınızda açılan gökyüzü ve alanları kullanacağımızı söylemiş oluruz. Oyun yeni bir frame geçişi yaptığında objelerin hesaplamalarını yaparak yeniden skybox görüntüsünü üzerine getirmiş oluyor.
Varsayılan “Skybox” görüntüsünü değiştirmek isterseniz “Window / Rendering / Lighting Settings” bölümünde yer alan “Skybox Material” alanından işlem yapabilirsiniz.
Solid Color: Sabit bir renk belirlemek için kullanılır. Alt kısımda yer alan “Background” alanından renk seçimi yapabilirsiniz. Böylece oyun başladıktan sonra ilk frame geçişinden sonra objeleri belirlediğimiz renk üzerine aktarır.
Depth Only: Bu seçenekte ise kamera bir önceki frame’den sadece derinlik bilgisini siler ve renkleri tutar. Yani eski sahnede yer alan objeleri gösterilir fakat derinlik bilgisine sahip olmazlar.
Don’t Clear: Bu seçenekte ise hem derinlik bilgisini hem de renkleri temizlemez. Genellikle oyunlarda kullanılmayan bir özellik olup gölgelendirme için nadiren kullanılır.
Culling Mask Seçeneği
“Culling Mask” alanından oyununuzdaki hangi katmanların(layer) gösterilip, gösterilmeyeceğini seçebilirsiniz. Unity çekirdek yapısıyla gelen 6 farklı katman bulunmaktadır.

Eğer objelere katman atayarak işlem gerçekleştirdiyseniz kameranın istediğiniz katmandaki objeleri gösterip, göstermemesini ayarlayabilirsiniz. Unity oyun motorunun varsayılan katmanları haricinde yeni bir katmanın nasıl ekleneceğini “Objeye Katman Ekleme” yazımızda incelemiştik.
Şöyle düşünebilirsiniz, sahnede yer alan bazı objeler için “Düşman” isminde bir katman oluşturduğunuz ve atadınız. Eğer oyununuzun belirli bir aşamasında bu düşman objelerinin gözükmesini istemiyorsanız “Culling Mask” alanından “Düşman” katmanını kaldırarak kameranın göstermesini engelleyebilirsiniz.
Projection Seçeneği
Öncelikle oyunlarda temel iki kamera açısı olduğunu bilmeliyiz. Bu kamera açılarından biri “Perspective camera” yani gerçek dünyadaki kamera çekimine yakın gösterimdir. “Perspective camera” ile ekrana yakın olan objeler daha büyük, uzak objeler ise daha küçük şekilde gözükür.
Diğer bir kamera açısı ise “Orthographic camera” olarak adlandırılıyor. Perspektif bir açı olmayıp ekrandaki tüm objeler aynı boyda gözükmektedir.
“Perspective camera” ve “Orthographic camera” açılarının farkını daha net anlayabilmeniz için aşağıda Unity resmi sitesinden aldığım görsel örneklerini ekledim. Her iki bakış açısı da oyun tercihine seçiliyor ama biz ileride yapacağımız tüm oyunlarda “Perspective camera” açısını kullanacağız.

Fov Axis ve Field of View Seçeneği
“Fov Axis” seçeneğiyle belirli bir eksende kamera açısını değiştirilebiliriz. Normalde sahne üzerinde kameranın üzerinde gözüken beyaz çizgi üzerinden de aynı işlemi gerçekleştirebiliyoruz.
Alt seçeneklerinden Horizontal ile yatay açısını ve Vertical ile dikey açısını “Field of View” alanından kaydırma menüsüyle ayarlayabilirsiniz.
Physical Camera
“Physical Camera” yani fiziksel kamera seçeneği ise gerçek dünyada olan kamera özelliklerini simüle etmemizi sağlıyor. Physical Camera seçeneğini işaretledikten sonra aşağıda açıklamalarını belirlediğimiz özellikler açılacaktır.
Focal Length: Kamera lensi ve sensörü arasındaki mesafeyi ayarlamamızı sağlayan özelliktir. Bu alandaki değeri küçülttüğünüzde ilgili kamera açısının küçüldüğünü fark edebilirsiniz. Ayrıca bu alanda yaptığımız değişikliklere göre Field of View alanını otomatik olarak oranlamaktadır.
Sensor Type: Sensor Type alanından açılan seçeneklerden gerçek dünyada yer alan sensör formatlarından birini seçebilirsiniz.

Seçeceğiniz “Sensor Type” bilgisine göre “Sensor Size” alanındaki X ve Y koordinat bilgileri otomatik olarak değişecektir. “Custom” seçeneğini işaretleyerek kendi ayarlarınızı da yapabilirsiniz.
Lens Shift: Kameranın merceğini yatay ve dikey eksende kaydırmak için kullanırız. X ve Y eksenleri otomatik olarak 0 değeriyle gelecektir. Her bir birim arttırdığınızda yani 0’dan 1’e çıkardığınızda sensörü belirtilen eksende boyutu kadar kaydırır.
Gate Fit: Kamera açısını film şeridi olarak adlandırılan alana göre eşitleme yapmamız için kullanılan seçenektir. Film şeridi olarak bahsedilen kısımı anlamak için aşağıdaki görsele bakabilirsiniz.

“Gate Fit” açılır menüsünde yer alan “Vertical” seçeneğiyle yatay olarak ve “Horizontal” seçeneğiyle dikey olarak eşitleyebiliriz.
“Fill” seçeneği çözünürlük ve film şeridi boyutları arasında en küçük olanı “Overscan” ise en büyük olan ölçüleri otomatik olarak seçer. Son seçenek olan “None” ise sadece film şeridi alanını kullanır.
Clipping Planes Seçeneği
“Clipping Planes” seçeneği ile kameranın başlangıç ve bitiş kısımlarını belirleyebiliriz. Böylece kamera açısının belirli bir noktadan başlayarak sadece belirli bir kısma kadar görüntülemesini sağlayabilirsiniz.

Yukarıdaki örnekte zemini uzun tutmamıza rağmen “Clipping Planes” alanından oyun ekranımızda sadece istediğimiz kısımları göstermesini sağlayabiliriz.
Depth Seçeneği
“Depth” seçeneği ekranda birden fazla kamera olduğu zaman kullanılmaktadır. Her kamera objesine “Depth” değeri vererek hangi kameranın gösterileceğini belirleyebiliriz. Yüksek değer verilen kamera ilk gösterilmektedir.
Örneğin bir araba yarışı oyunu yaptığınızı düşünün ve oyun anında oyuncu kamera açılarını değiştirebiliyor. Yani arabanın içinden, üstünden vs gibi kamerayı değiştiriyor. Burada oyun başladığında hangi kameranın ilk görüntü olduğunu seçebiliriz.
Rendering Path Seçeneği
Kamera için render yöntemlerinin belirlendiği kısımdır. Daha net olarak söylemek gerekirse kamera tarafından görüntü oluşturma yöntemini yani oyunumuzun grafik kalitesini kamera için tanımladığımız kısımdır.

Varsayılan olarak “Use Graphics Settings” olarak gelecektir. Bu ayar seçili olduğunda “Edit/Project Settings/Graphics” altındaki ayarları geçerli sayacağını belirtmiş oluyoruz. Bu ayarlara ilerleyen bölümlerde işleyeceğimiz performans kısmında detaylıca değineceğiz.
Bu alanda seçebileceğimiz “Forward” seçeneği, kameranın görüntüleyeceği tüm nesneleri ayrı ayrı oluşturmasını sağlar. Objlerin daha hızlı oluşmasını sağladığı için donanımsal gereksinimi düşürür. Varsayılan olarak “Edit/Project Settings/Graphics” altında bu ayar seçilidir.
“Deferred” seçeneği ışığın ve gölgelerin oluşmasını erteler. Eğer sahnede birçok ışık kullanıyorsanız etkili olabilir ama donanım olarak yani performans olarak zorlayacaktır.
“Legacy Vertex Lit” seçeneği ise kamera tarafından objelerin görüntüleri aktarırken gölgeleri oluşturmaz.
Target Texture Seçeneği
Kameramıza doku eklemek için kullanılan seçenektir. Kameranın aktardığı görüntüye otomatik olarak bir texture ekleyebiliriz. Genellikle oyunlarda çok kullanılmaz ama oyundaki kameralardan birinin görüntüsünü güvenlik kamerası mantığıyla bir objeye yansıtılmak için kullanılabilir.
“Render Texture” türünde bir texture atamasından sonra diğer görüntü ayarlarını devre dışı bırakacaktır.
HDR Seçeneği
“High dynamic range” yani “HDR” Objelerin gerçek renk ve parlaklıkta gösterilmesini sağlayarak daha gerçekçi görüntüler elde etmemizi sağlar. “Edit/Project Settings/Graphics” altından ayarlanır fakat kaynak tüketimi fazla olduğu için mobil cihazlarda varsayılan olarak kapalı durumdadır.
MSAA Seçeneği
Resimlere çok yaklaşıldığında bazı alanlarında pixeller gözükerek resmi tırtıklı bir yapıda göstermektedir. “Multi-sample anti-aliasing” yani MSAA” seçeneği ile bu durumunu bir miktar azaltabilirsiniz.

Örnek etkisi için Unity sitesinde yer alan görselleri yukarıda ekledim. Oldukça etkili bir yöntem olduğu için tercih edilmektedir fakat kaynak tüketimini arttıracaktır.
Allow Dynamic Resolution
“Allow Dynamic Resolution” seçeneği kamera için önemli ayarlardan biridir. Oyundaki FPS(kare hızı) durumuna göre ekran kartındaki yükü azaltmak için dinamik olarak çözünürlüğü azaltmaktadır.
Örneğin oyununuzun bir bölümünde sahnenizde yüzlerce objenin olduğu bir görüntü aktarmaya çalıştığınızı düşünün. Bu gibi bir durumda objelerin hesaplamalarının yapılması sırasında FPS de düşme ve oyunda donmalar olur. Fakat “Allow Dynamic Resolution” özelliği aktif olduğunda Unity çözünürlüğü düzenleyerek FPS’in stabil olarak devam etmesini sağlar.
Target Eye: VR projeler için gerekli olan bir özelliktir.
Occlusion Culling
“Occlusion Culling” ayarları oyununuzun performansı için en önemli konularından biri. Fakat “Occlusion Culling” konusundan önce oyunun daha performanslı çalışabilmesi Unity tarafından otomatik olarak gerçekleşen “Frustum Culling” işlemine biraz değinelim.
Frustum Culling, sahnede kameranın açısında olmayan kısımları otomatik olarak oyun ekranından çıkarır. Önceki derslerde gördüğümüz gibi kameranın, sahnede açısını “Frustum Culling” ile ayarlayabiliyorduk.

Örneğin yukarıdaki görselde kamera açısına sadece kırmızı küp objesi girdiği için oyun ekranında yeşil objeyi göremeyiz. Bu şekilde Yeşil Obje sahnede olmasına rağmen, kamera açısında olmadığı için yüklenmez ve performans kaybı otomatik engellenir.
Şimdi bir diğer önemli performans öğemiz Occlusion Culling kısmına giriş yapalım.
Occlusion Culling ile bir objenin arkasında kalan ve gözükmeyen diğer objeleri ekran kartına göndermeyerek, performans düşüşlerini engelleyebiliriz.
Occlusion Culling sistemini test edebilmemiz için Unity Asset Store üzerinden “Snaps Prototype | Office” setini indirerek import ettim.

Occlusion Culling için eklediğimiz ofis sahne tasarımında bir çok obje yer alıyor. Eğer oyunumuz bu mekanda geçseydi ve Occlusion Culling sistemini kullanmazsak kamera açısına giren tüm objeleri GPU’ya gönderecek ve performans kaybına sebep olacak. O yüzden hemen Occlusion Culling işlemine başlayacağız ama önce öğrenmemiz gereken ilişkili üç kavram var.
- Occluder Static
- Occludee Static
- Dynamic Occlusion
Occluder Static
“Occluder Static” seçilen bir objenin arkasında kalan diğer objeler, kamera açısına girmediği sürece işlenmeyecektir.
“Occluder Static” özelliğini açmak için sahnedeki objelerinizi seçtikten sonra “Inspector” alanında yer alan “Occluder Static” seçeneğini işaretlememiz gerekiyor.
Örneğin aşağıdaki görseldeki gibi sahnemizde yer alan tüm duvar ve sütun gibi büyük ve sabit olan objeleri seçerek “Occluder Static” olarak belirledik. Böylece Unity’e bu seçtiğimiz nesnelerin arkasında kalan objeleri kamera görmediği süre boyunca GPU gönderip performansı düşürme demiş oluyoruz.

“Occluder Static” olarak belirlediğiniz objelerin sabit objeler yani oyunda hareket etmeyecek objeler olması gerekiyor.
Occludee Static
Occludee Static ise tam tersi şekilde büyük bir objenin arkasında kalabilecek objeleri GPU işlemeyerek performans kaybı olmasın diye işaretleyebiliyoruz.
Aynı şekilde “Occludee Static” özelliğini açmak için sahnedeki objelerinizi seçtikten sonra “Inspector” alanında yer alan “Occludee Static” seçeneğini işaretlememiz gerekiyor.

Şöyle düşünebilirsiniz. Örneğin oyununuz bir sokakta geçiyor ve evlere girerek eşya arıyorsunuz. Ama eve girmediğiniz sürece evin içindeki sabit eşyaların Unity oyun motoru tarafından işlenmesine gerek yok o yüzden “Occludee Static” olarak işaretleyebilirsiniz.
“Occludee Static” olarak belirlenen objelerin oyununuzda hareket etmeyen sabit objeler olması gerekmektedir.
Bir obje hem Occluder Static hem de Occludee Static olarak ayarlanabilir.
Dynamic Occlusion
“Occludee Static” olarak belirlediğimiz objelerin statik yani hareket etmeyecek objeler olarak belirlediğimizi söylemiştik. “Dynamic Occlusion” ayarı sayesine ilgili obje statik seçilse bile objenin oyun içinde hareket etmesine izin vermiş oluyoruz.
“Dynamic Occlusion” özelliğini ilgili obje seçildikten sonra açılan “Inspector” penceresindeki “Mesh Renderer” bileşeninin seçenekleri içerisinden değiştirebilirsiniz.

Occlusion Culling Ayarları
Objelerimizi “Occluder Static” ve “Occludee Stati”c olarak ayarladıysak şimdi “Camera” objemize girerek “Occlusion Culling” özelliğini açarak sonuçları görebiliriz.

“Occlusion Culling” ayarlarının sonuçlarını görmek için “Game” ekranında yer alan “Stats” penceresini kullanabilirsiniz. Benim oluşturduğum sahnedeki sonuçlar aşağıdaki gibi gözüküyor. Aradaki farka dikkat ederseniz ne kadar etkili bir yöntem olduğunu anlayabilirsiniz.

Batches: Objerin statik ve dinamik durumuna göre değişen ve Unity oyun motoruna her framede gönderilen işlem sayısıdır.
Ayrıca “Occlusion Culling” ayarlarını yapmak ve simülasyonu incelemek için üst kısımda yer alan kısımdan “Windows/Rendering/Occlusion Culling” menüsüne girelim. Bu seçeneğe girdikten sonra karşınıza aşağıdaki gibi pencere gelecektir.

Bake Ayarları
Occlusion penceresinde bulunan “Bake” sekmesindeki parametrelerle “Occlusion Culling” işlemlerini özelleştirebiliriz.
Smallest Occluder: Bir objenin arkasında farklı bir objenin gizlenebilmesi için en az kaç birim uzunlukta olması gerektiğini ayarladığımız kısımdır. Varsayılan olarak 5 birim olarak gelen bu ayarı küçülterek daha küçük nesnelerin arkasında kalan objelerinde gizlenmesini sağlayabilirsiniz.
Örneğin duvarımız 5 birimse çöp kutumuzun arkasında kalanlarında işlenmesi istedik ve 0.5 birim olarak değiştik. Böylece çöp kutusunun arkasındaki objeleri de işlemeyecektir.
Buradaki ince durum ise daha küçük objeler incelediği için oyunuuz daha fazla yer kaplayacaktır. Aynı pencerede yer alan “Occlusion data size” alanından kontrol sağlayabilirsiniz.
Smallest Hole: Occluder Static olarak belirlenen bir obje yani sahnemizde bulunan duvar ve sütunlarımızda bir delik varsa bunun büyüklüğünü belirlediğimiz alandır.
Eğer duvar üzerinde belirlediğimiz çaptan küçük olan deliklerin arkasında yer alan objeler gözükmeyerek, sanki bir delik yok ve duvarın arkasında saklanıyor gibi işlem yapar.
Aşağıdaki örneğe göz atarsanız “Smallest Hole” ayarını 1 değerine çektiğimizde arkada yer alan sandalye, duvarın arkasındaymış gibi gizlenir.

“Smallest Hole” yarı ne kadar düşük olursa boyutu arttıracak ve performansı düşürecektir.
Backface Threshold: Bir objenin içerisinde ya da kamera açısının altında kalan objeler bulunuyorsa Occluder hesaplanmaz.
Bake Butonu: Bak butonu ile objeler üzerinde değişiklik yaptıktan sonra tekrar performans sonuçlarını hesaplamasını yaptırtabiliriz.
Camera ayarlarını konusundan Occlusion konusuna geçiş yaptık ve ister istemez konumuz biraz dallandı. Fakat Occlusion ile oldukça alakalı olan iki adet bileşeni de incelemeden konuyu bitirmeyelim.
Occlusion Portal Bileşeni
“Occlusion Portal” bileşeni ile belirli bir objeden sonra yer alan tüm objelerin yüklenmesini durdurabilir ve açabiliriz.

Örneğin bir kapımız var ve kapı kapalıyken arkasında yer alan tüm objeleri gizliyoruz. Eğer kamera kapıyı geçerse yani kapıyı açarsa, kapının arkasındaki objeleri GPU ya gönderebiliriz. Aslında “Occluder Static” işlemini bir portal olarak oluşturduğuuzu düşünebilirsiniz.

Aynı örnekten devam ediyoruz. Ofis odalarının arasındaki koridora bir kapı ya da duvar objesi koydum ve objeye “Occlusion Portal” bileşenini ekledim.
Bileşeni ekledikten sonra yukarıdaki görseldeki gibi yeşil bir sanal alan belirlememiz gerekiyor. Bileşen içindeki “Edit Bounds” alanına tıklarsanız portalı boyutlandırabileceğiniz yapıyı görebilirsiniz.
“Occlusion Portal” bileşeni içerisinde yer alan “Open” kutucuğunu işaretlerseniz postalın arkasındaki objeleri Occlusion işlemine dahil edecektir. Bu alandaki işareti kaldırdıktan sonra kamera açımız portalı geçene kadar kapının arkasındaki objeler işlenmeyecek ve sisteme yük bindirmeyecektir.
Eklediğimiz kapı objesinin Occluder Static olarak işaretlenmesi gerekmektedir.
Occlusion Area Bileşeni
“Occlusion Area” bileşeni ile Occlusion hesaplamasının yapılacağı alanları belirleyebiliriz.
Bunun için sahnemize bir adet “Create Empty” objesi yani boş bir obje ekiyoruz. Objemizin içerisine “Occlusion Area” bileşenini ekleyerek Occlusion işlemine dahil edilecek alanları belirterek fazladan yapacağı iş yükünü azaltmış oluruz.

Örneğin yukarıdaki görselde area olarak ikinci ofis kısmını (yeşil olarak gösterilen alan)seçtik. Bu şekilde Occlusion hesaplamalarının sadece bu alan için yapılmasını seçerek kamera açısına giren ama sahnede olmasına gerek olmayan kısımları çıkarış olduk.
Bir sonraki dersimiz olan ışık türlerini, hesaplama yöntemlerini, ayarlarını incelediğimiz ve yeni skybox oluşturduğumuz dersimize aşağıdaki bağlantıdan ulaşabilirsiniz.
biraz kolay olsun
Merhaba Hülya, Keşke elimde olsa ama oyun yapmak kolay bir işlem değil maalesef. Ama düzenli çalışma ve sürekli tekrar ile engeller aşılabilir 🙂
Anlatım çok güzel ve sade. Anlatıma görsel olarak da desteklenmesi daha anlaşılır kılmış. Yeni başlayan arkadaşlar için güzel bir sanal arşiv oluşturuyorsunuz.
Bu şekilde gelen yorumlar daha fazla içerik yazmam için beni gerçekten motive ediyor. Düşüncelerin için çok teşekkürler Naci 🙂
Occluder Static yaptığımızda duvarın arkadındakiler zaten gizleniyor bu yüzden neden duvar arkasındakilerini Occludee Static yaptık .Bu ikisi arasındaki farkı bana anlartırmısınız
Hocam bide bu kaybolma işlemi nasıl işliyor kameranın bakış açısına mı göre yani kameraya tıkladığımızda çizgilerin aldığı alan yoksa game ekranında görülmeyen yerler scene ekranıdamı kayboluyor bu konuyu açıklarmısınz şu kardeşinize
Mesela burada Frustum Culling sayesinde buradaki yeşil küp kamera açısından dolayı gözükmüyor. Ama kırmızı küpün arkasında daha küçük bir küp olsaydı kamerada gözükmeyecekti fakat işleme alınacaktı. Bunun için küçük küpü Occludee Static yaparak büyük küpün arkasındayken işlenmemesini sağlayabiliriz.
Merhaba Mustafa, Occluder Static daha çok gizlenebilen ama hareket edebilecek objeler için kullanılır. Occludee Static ise hiç hareket etmeyen objeler için kullanılıyor.
Aslında bende hep arada kalıyorum ama Occludee Static daha çok performans istiyor gibi gözüküyor. Mantıken Occludee Static seçilen objenin arkasında farklı bir obje var mı diye kontrol etmesi gerekiyor.