You can find the height and width values of an orthographic camera using the way shown below.
public class CameraManager : MonoBehaviour {
public Camera MainCamera; void Start ()
{
float height = 2f * MainCamera.orthographicSize;
float width = height * MainCamera.aspect; Debug.Log("Height = " + height + " / Width = " + width);
}
}
Bu yazıma başlamadan önce, eğer okumadıysanız acilen okumanız gereken bir kaynak önermek istiyorum; “Robert Nystrom — Game Programming Patterns”. Bu kitapta, oyun dünyasındaki genel problemleri çözmek için kullanılan design pattern’lardan oldukça detaylı olarak bahsediliyor.
Senaryo
20x20 birimlik bir tabanın üzerinde, her seferinde bir birim olmak üzere aşağı, yukarı, sağa ve sola hareket edebilen bir küp düşünün. Bu kübün her hareketi, geri alınabilir olsun. Yani küp “yukarı, yukarı, sol, sol” hareketini tamamladıktan sonra, her “geri al” komutu verildiğinde, “sağ, sağ, aşağı, aşağı” komutlarını tekrarlayarak, başlangıç noktasına dönsün.
Adım 1 — Command Design Pattern’a Giriş
Command Design Pattern’da, isteklerimizi komut nesneleri olarak tutarız. Her bir komut nesnesinin, bir execute metodu bulunmak zorundadır. Bu execute methodu içine bir actor nesnesi yollanır. Böylece actor nesnesine ulaşılmış ve ona aksiyon aldırılmış olur. …
Singleton’ı şu iki maddede özetleyebiliriz.
Bir design pattern’ı kullanmadan önce onun zayıf yanlarını iyi bilmek gerek. Profesyonel hayatta, her yanından Singleton fışkıran kodlara gülündüğüne bir çok kez şahit oldum. Bu kahkahaların sebebini araştırırken okuduğum ve içlerinden notlar aldığım bir kaç yazı var. Singleton’ı uygulamadan önce bu notları sizlerle paylaşmak isterim.
Use Your Singletons Wisely (Singletonlarınızı Bilgece Kullanın)
Yazı, neyin gerçekten Singleton olması gerektiğini sorguluyor. Bu sorgulamayı yapmadan önce, Singleton’ın sınıflar arası bağımlığı artırdığını belirtiyor. Yani Singleton’ın göründüğü kadar masum olmadığı konusunda yazar ile aynı fikirdeyiz.
Yazının can alıcı yerine geldiğimizde Singleton uygulanmadan sorulması gereken 3 soru ile karşılaşıyoruz. Bana sorarsanız, bunlar bir hayli haklı sorular. …
Unity3D’de Nesneleri yaratmanın ve öldürmenin yükü bir hayli ağır. Saniyede yüzlerce nesneye bellekte yer açıp, sonra o nesneleri bellekten tekrar silmek, performans penceresinden bakıldığında pek de hoş karşılanmayabilir. Eğer nesne yaratma ve silme işlemini çok sık yapıyorsak, Nesne Havuzu(Object pool) işte tam da burada yardımınıza koşuyor.
Senaryo
Bir silah nesnesimiz var. Bu silah nesnesi bulunduğu noktadan her yöne saniyenin onda biri kadar bir sıklıkla ateş ediyor. Mermiler ekrandan çıktıklarında siliniyorlar (tabi biz silmeyeceğiz, havuza atacağız).
Adım 1
Senaryomuzu gerçeklemeye, bullet nesnemizi oluşturarak başlayalım. Bullet nesnesini bir Sphere nesnesine component olarak ekleyelim ve bu nesneyi bir prefab haline getirelim.
Bullet
using…
Robert C. Martin’in Functional Programming mi, Object Oriented Programming mi sorusuna iyimser ve birleştirici bir yaklaşım sunduğu bu makalesini tavsiye ediyorum. Ben yalnızca okurken altını çizdiğim yerleri sizinle paylaşacağım.
İyi bir fonksiyonel programlama nesne yönelimli olmalıdır. İyi bir nesne yönelimli programlama, fonksiyonel olmalıdır.
Çok biçimlilik(polymorphism) olmadan nesne yönelimli programlama olmaz.
Nesne yönelimli olan ve nesne yönelimli olmayan programlamanın arasındaki en gerçek fark çok biçimliliktir.
Çok biçimliliğin uygulanma yöntemi çağıran ve çağrılan arasında kod bağımlılığı yaratmamalı.
Nesne yönelimli programlamayı şöyle tanımlayabiliriz o halde; fonksiyonları çağıranın kaynak kodu ve çağrılanın kaynak kodu arasında bağımlılık olmadan çağırmak için çok dinamik biçimliliği kullanma tekniği…
Dinamik çok biçimliliği ve referential transparency’yi (Belli bir fonksiyonun içine bir girdi değeri verirsen, hep aynı sonucu alırsın. Anlamı bu. Örnek olarak — f(3) = 4. f(x) = x+1) birlikte kullanan bir sistemi yaratmak mümkündür. …
Sınıfımıza, onun yapısını bozmadan yeni bir fonksiyonellik kazandırmak istiyoruz. Bu problemi nasıl çözeceğimize dair iki örneğim var; birincisi, bahsi geçen sınıftan alt sınıflar türeterek ona yeni fonksiyonellikler kazandırmak, ikincisi ise Decoreator Design Pattern kullanmak. Bu yazıda ikinci çözümü açıklayacağım.
Decorator Design Pattern, giriş paragrafında da bahsettiğimiz gibi, bir sınıftan alt sınıflar türetip, o sınıfa daha fazla fonksiyonellik kazandırmanın bir alternatifi.
Şimdi sizi bu pattern üzerine verilmiş güzel bir örneğe götüreceğim.
SourceMaking — Decorator Design Pattern — İlk Örnek
Bir arayüz tasarladığımızı düşünelim.Bu arayüzde bomboş bir pencere yaratabiliriz. Yatay scrollBar’lı bir pencere de… Kenarları çizgili bir pencere ve hatta dikey scrollBar’lı bir pencere de yaratabiliyoruz. …
Biz yazılım geliştiriciler için hafıza yönetimi, üzerinde itinayla durulması gereken bir konu. Hafızayı yönetebilmek için de onun temellerine inmek gerek. .Net’te hafıza yönetimine dair bir çok yazı okudum, ancak bunlar arasında en çok John Skeet’in Memory in .NET yazısını beğendim. Bu yazıyı dilim döndüğünce, Türkçe’ye kazandırmak istedim. Buyrunuz efendim. :)
.Net’te hafızanın nasıl çalıştığını anlamanın yolu, bir değişkenin ne olduğu anlamaktan geçer. Değişkeni en basit şekilde şöyle tanımlarız; “değişken, programın kodunda kullandığımız değişken ismi ile hafızada bir slot arasındaki ilişkilendirmedir”. Bir değişken, kendisinin hafızada ilişkilendirildiği slotta tutulan bir değere sahiptir. Bu slotun boyutu ve bu slotta tutulan değerin yorumu(interpretation), değişkenin tipine bağlıdır. …
Eğer yazdığımız modülleri yeni projelerimizde kullanabiliyorsak, doğru yoldayız. Tekrar kullanılabilirlik biz yazılımcılar için çok önemli.
Unity3D ile geliştirdiğim projelerimde, oyun verilerimi yerel diske kaydedip okurken, json tabanlı bir sistem kullanıyorum. Fakat bu güne kadar, bu sistemin en önemli kısmını kolayca tekrar kullanılabilir hale getirmediğimi fark ettim. Önce utancımı yaşadım, sonra da bu sistemi LB_LocalDataManager(LDM) isimli bir modül haline getirdim. Sizlerle bu sistemi paylaşmak istiyorum.
LDM, Unity projelerinizde, yerel diskinize dosya kaydetmek ve okumak için kullanabileceğiniz bir modül. Modülümüzün LB_LocalDataSaver ve LB_LocalDataLoader olmak üzere iki temel bileşeni var.
Yerel diske veri kaydetmemizi sağlayan bu sınıfımızın tek bir fonksiyonu var. Bu fonksiyonun özelliği ise generic olması. Tekrar kullanılabilirliğe bu sayede büyük bir katkıda bulunuyor. Ona bir T tipinde bir data objesi ve bir dosya yolu verdiğinizde, T tipindeki data objesini json’a çeviriyor ve verdiğiniz yola bu dosyayı kaydediyor. Bir önceki cümlede anlattığım fonksiyonu, yazının sonundaki örnekle daha açık hale getireceğiz. …