Unity Gizmos sınıfı, özellikle editor üzerinde görsel oluşturmamızı sağlayarak, sahneyi daha iyi analiz edip incelememizi sağlar. Bu sınıf aracılığıyla oluşturduğumuz görsel ögelere ise Gizmo adı verilmektedir. Eğer İngilizce’ye birazcık aşinaysanız, Gizmos da bunun çoğul hali olduğunu tahmin edersiniz.
Kelime anlamı olarak Gizmo, Türkçede aygıt, araç, ıvır zıvır gibi anlamlara gelse de, İngilizce anlamı olarak baktığımızda, belirli amaç için oluşturulan herhangi bir küçük cihaz olduğunu görmekteyiz. Unity içerisinde de Gizmo dediğimiz şeyler sınıfı bahsettiğim gibi belirli görselleştirmeler oluşturmamızı sağlayan küçük araçlardır.
Gizmolar genellikle çok basit formdadırlar. Basit bir çizgi, küp, küre veya bizim belirttiğimiz bir mesh yapısında olabilirler. Boyut, renk, pozisyon ve rotasyon değerlerine sahiptirler, böylece farklı durumlar için bize az ama yeterli sayıda özelleştirme imkanı sunarlar.
Unity Gizmos Sınıfı, yalnızca OnDrawGizmos ve OnDrawGizmosSelected fonksiyonları içerisinde çalışırlar. Bu iki fonksiyon daha önce GameObject sınıfında bahsettiğimiz gibi, Start(), Update() gibi, Unity tarafından, kodunuzda bulunuyorsa otomatik olarak çağırılan fonksiyonlardır. Monobehaviour sınıfından miras alan her sınıfta bu 2 fonksiyonu da kullanabilirsiniz.
Bu iki fonksiyonu kullanmadan önce ikisinin farklarından bahsetmek istiyorum. Temelde, ikisi de aynı Update fonksiyonu gibi, her karede çağırılan fonksiyonlardır. Bunları birbirinden ayıran ise, OnDrawGizmosSelected yalnızca objeyi seçtiğinizde çalışacakken, OnDrawGizmos fonksiyonu obje seçili olsun veya olmasın çalışacaktır. Yazımlarını aşağıda görebilirsiniz.
Unity Gizmos Sınıfı ile Kullanılabilecek Kodlar
Unity Gizmos Sınıfı ile kullanılabilecek kodlar renk, matrix ve pozlama (exposure) değerlerini değiştirebildiğimiz statik özellikler(properties) ve gizmo oluşturmamızı sağlayan static fonksiyonlardır. Aşağıda örnek kodlarıyla beraber açıklamalarını bulabilirsiniz.
Unity Gizmos Sınıfı Statik Özellikler
color: Çizilecek olan gizmo rengini belirttiğimiz değişkendir. Color tipinde bir değişken vermemiz gerekir. Örnekte de göreceğiniz üzere, istersek Color sınıfı aracılığıyla istersek de direkt olarak rgba değerlerini vererek bir renk oluşturmamız gerekir. RGB kısmı kırmızı, mavi, yeşil değerleriyle alakalı iken, a değeri alpha, yani görünürlük, şeffaflık ile alakalı değerdir. Hiçbir renk değişikliği yapmazsanız, beyaz rengi otomatik olarak kullanılır.
exposure: Pozlama doğrulamasını sağlayacak olan resim (texture) ayarını yapmamızı sağlar.
matrix: Gizmoyu çizecek olan editorun Transform matrix değerini ayarlamamızı sağlar. Bu sayede local transform değişiklikleri, yön, pozisyon gibi, gizmo üzerinde de gözlemlenecektir. Örneğin gizmoyu objenin altında olacak şekilde şekilde oluşturmak istiyorsunuz.
Unity Gizmos Sınıfı Statik Fonksiyonlar
DrawCube: Sahne üzerinde belirtilen konum ve ölçülerde küp şekli oluşturmamızı sağlar. Aşağıda gördüğünüz örnekte renk ve matrix konularına da farklı açılardan değindim. Özellikel matrix etkisini gözlemlemek için, kodu attığınız objenin rotasyon, scale gibi değerlerini kurcalayarak Gizmoların değişimlerini gözlemlemenizi öneririm.
using UnityEngine;
//Unity Gizmo ile farklı şekillerde küp görseli oluşturma yöntemleri.
public class DrawCubeGizmo : MonoBehaviour {
void OnDrawGizmos () {
/*
Obje pozisyonunu merkez olarak alan 1,1,1 ölçülerinde Küp gizmosu çizmemizi sağlar.
.25f alpha değerinde kırmızı bir renk elde etmemizi sağlar.
*/
Gizmos.color = new Color (255, 0, 0, .25f);
Gizmos.DrawCube (transform.position, new Vector3 (1, 1, 1));
/*
Bu komut ile artık gizmoların transform değerleri obje matrixi üzerinden hesaplanacak
Böylece objenin pozition, rotation ve scale değerleri de gizmolarımızda etkili olacak.
eski değişkeni ile yaptığımız da, sonraki satırlarda matrix'i eski haline getirmek için
öncelikle varolan matrixi bir değişkende tutmaktan başka bir şey değil.
*/
Matrix4x4 eski = Gizmos.matrix;
Gizmos.matrix = transform.localToWorldMatrix;
/*
Obje matrixine göre y ekseninde 3 birim aşağıda bulunan yeşil renkli bir küp oluşturmamızı sağlar
Küpün ölçüleri x:3,y:.1f,z:3 şeklindedir.
*/
Gizmos.color = Color.green;
Gizmos.DrawCube (Vector3.down * 3, new Vector3 (3, .1f, 3));
//Gizmo matrixin eski haline getiriyoruz, böylece genel(world) matrixine göre değer kullanabiliriz.
Gizmos.matrix = eski;
//Objenin 1 birim ilerisinde (local z) mavi renkli bir küp oluşturmamızı sağlar.
Gizmos.color = Color.blue;
Gizmos.DrawCube (transform.position + transform.forward, Vector3.one * .25f);
}
}
DrawFrustum: Kamera nesnelerimizde de görüş açısını gösteren şekil olarak gördüğümüz, verdiğimiz ölçülere göre farklı taban genişliklerine sahip bir frustum şekli oluşturmamızı sağlar. Örneği inceleyin, ufak bir egzersiz olarak obje ile aynı yöne bakmasını nasıl sağlarsınız bunun üzerine düşünün.
using UnityEngine;
public class DrawFrustomGizmo : MonoBehaviour {
public float fov = 60;
public float maxRange = 300;
public float minRange = 1f;
public float aspect = 16f / 9f;
void OnDrawGizmosSelected () {
/*
Obje merkezini baz alan bir frustom oluşturmayı sağlar.
fov: dikey görüş alanı (vertical field of view)
maxRange: frustom gizmosunun uzak kenarının (far plane) mesafesi
minRange: frustom gizmosunun yakın kenarının (near plane) mesafesi
aspect: yatay ve dikey kenarların uzunluklarının oranı
*/
Gizmos.DrawFrustum (transform.position, fov, maxRange, minRange, aspect);
}
}
DrawGUITexture: Sahneye bir resim (texture) çizmemizi sağlar. Yalnız altını çizmek gerek, resim, aynı UI elementlerinde olduğu gibi z ekseni önemsenmeden çizilir. XY ekseni zemini üzerinde gösterilmektedir. Özellikle 2 boyutla bizi sınırlandırıyor olması, pek kullanılmasa da olur dediğim kodlardan biri.
using UnityEngine;
public class DrawGUITextureGizmo : MonoBehaviour {
public Texture texture;
public Material textureMat;
public float posX = 0, posY = 0, scaleX = 1, scaleY = 1;
public int leftBorder, rightBorder, topBorder, bottomBorder;
void OnDrawGizmos () {
/*
Verdiğiniz genel pozisyonda bir görsel oluşturmanızı sağlar.
border değerleri ise, belirtilen kenardan görseli genişletme-ekleme yapmanızı sağlar.
*/
if (texture != null) {
//versiyon: Rect değerleri ve resim objeli
Gizmos.DrawGUITexture (new Rect (transform.position.x, transform.position.y, scaleX, scaleY), texture);
//Versiyon: Öncekine ek olarak border seçeneklerini de verebilirsiniz
Gizmos.DrawGUITexture (new Rect (posX, posY, scaleX, scaleY), texture, leftBorder, rightBorder, topBorder, bottomBorder);
//isterseniz her iki versiyonda da materyalini de belirtebilirsiniz.
Gizmos.DrawGUITexture (new Rect (transform.position.x + posX, transform.position.y + posX, scaleX, scaleY), texture, textureMat);
}
}
}
DrawIcon: Sahnede bir ikon oluşturmamızı sağlar. Özellikle kalabalık sahnelerinizde, ikonlara tıklayarak objeleriniz gözükmese de objeyi seçebilmenize imkan vermesi açısından faydalıdır. Pozisyon ve dosya ismi vermemiz gerekir. Kullanacağımız resim, icon dosyası da projemizde Assets/Gizmos klasörü altında olmalıdır.Ayrıca, 3. parametre olarak da, bool tipinde, kullandığınız görselin boyutlandırılmasını isteyip istemediğini belirttiğiniz bir değişken de verebilirsiniz.
using UnityEngine;
public class DrawIconGizmo : MonoBehaviour {
public string iconFileName;
void OnDrawGizmos () {
//Örnek bir kullanım olarak, sahnede oyuncunun başlama noktasında ikon oluşturmak mantıklı olabiir
Gizmos.DrawIcon (transform.position, iconFileName, true);
}
}
DrawLine: Başlangıç ve bitiş noktalarını belirlediğimiz bir çizgi oluşturmamızı sağlar.
using UnityEngine;
public class DrawLineGizmo : MonoBehaviour {
public Transform target;
void OnDrawGizmosSelected () {
if (target != null) {
//eğer target değişkeni boş değilse, objeniz ve target arasında kırmızı bir çizgi oluşturmanızı sağlar.
Gizmos.color = Color.red;
Gizmos.DrawLine (transform.position, target.position);
}
}
}
DrawMesh: Belirttiğimiz mesh objesini sahnede çizmemizi sağlar.
using UnityEngine;
public class DrawMeshGizmo : MonoBehaviour {
public Mesh mesh;
public int subMeshIndex = 0;
void OnDrawGizmos () {
if (mesh != null) {
//Belirtilen meshi, objenin poziyonunda, obje rotasyonu ve scale değerine sahip şekilde oluşturmamızı sağlar.
Gizmos.DrawMesh (mesh, transform.position, transform.rotation, transform.localScale);
/*
Eğer mesh objeniz subMesh içeriyorsa, istediğiniz submeshindex değerini belirterek
sadece belirli bir parçasını çizdirebilirsiniz.
*/
if (subMeshIndex < mesh.subMeshCount) {
Gizmos.DrawMesh (mesh, subMeshIndex, transform.position, transform.rotation, transform.localScale);
}
}
}
}
DrawRay: Başlangıç noktası ve yönünü belirterek bir ışın oluşturmamızı sağlar. DrawLine fonksiyonundan farklı olarak, bitiş noktasını bilmesek de, yön bilgisi ile belirli uzunlukta bir çizgi çizebilmemize imkan tanır.
using UnityEngine;
public class DrawRayGizmo : MonoBehaviour {
/*
Objenin ileri, sağ ve yukarı yönlerini gösterir.
Mesh bulundurmayan objeleri gözlemlemede kullanılabilir.
*/
void OnDrawGizmos () {
Gizmos.color = Color.blue;
Gizmos.DrawRay (transform.position, transform.forward);
Gizmos.color = Color.red;
Gizmos.DrawRay (transform.position, transform.right);
Gizmos.color = Color.green;
Gizmos.DrawRay (transform.position, transform.up);
}
}
DrawSphere: Belirttiğimiz yarıçapa sahip bir küre çizmemizi sağlar.
using UnityEngine;
public class DrawSphereGizmo : MonoBehaviour {
public Vector3[] yollar;
void OnDrawGizmosSelected () {
//Belirtilen yol pozisyonlarında küreler oluşturarak görselleştirme sağlar.
for (int yolIndex = 0; yolIndex < yollar.Length; yolIndex++) {
//Turuncu renkli 1 birimlik bir küre oluşturmamızı sağlar.
Gizmos.color = new Color (255, 102, 0);
Gizmos.DrawSphere (yollar[yolIndex], 1);
}
}
}
DrawWireCube: Belirttiğimiz ölçülere sahip bir küp çizmemizi sağlar. DrawCube fonksiyonundan farklı olarak, bu fonksiyonla çizilen küpler yüzeylere sahip değildir, yalnızca kenar çizgilerinden oluşur.
using UnityEngine;
public class DrawWireCube : MonoBehaviour {
void OnDrawGizmosSelected () {
/*
Obje pozisyonunda 1,1,1 boyutlarında sarı renkli
yalnızca kenarları görünen bir küp oluşturmayı sağlar.
*/
Gizmos.color = Color.yellow;
Gizmos.DrawWireCube (transform.position, new Vector3 (1, 1, 1));
}
}
using UnityEngine;
public class DrawWireCube : MonoBehaviour {
void OnDrawGizmosSelected () {
/*
Obje pozisyonunda 1,1,1 boyutlarında sarı renkli
yalnızca kenarları görünen bir küp oluşturmayı sağlar.
*/
Gizmos.color = Color.yellow;
Gizmos.DrawWireCube (transform.position, new Vector3 (1, 1, 1));
}
}
DrawWireMesh: Verdiğimiz mesh objesini ekranda oluşturmamıza imkan tanır. DrawWireCube fonksiyonu gibi, yalnızca kenar çizgilerinin gözükecek şekilde mesh görünümünü oluşturur.
using UnityEngine;
public class DrawWireMeshGizmo : MonoBehaviour {
public Mesh mesh;
public int subMeshIndex = 0;
void OnDrawGizmosSelected () {
if (mesh != null) {
/*
Belirtilen meshi, yalnızca kenar çizgileri gözükecek şekilde,
objenin poziyonunda, obje rotasyonu ve scale değerine sahip şekilde oluşturmamızı sağlar.
*/
Gizmos.DrawWireMesh (mesh, transform.position, transform.rotation, transform.localScale);
/*
Eğer mesh objeniz subMesh içeriyorsa, istediğiniz submeshindex değerini belirterek
sadece belirli bir parçasını çizdirebilirsiniz.
*/
if (subMeshIndex < mesh.subMeshCount) {
Gizmos.DrawWireMesh (mesh, subMeshIndex, transform.position, transform.rotation, transform.localScale);
}
}
}
}
DrawWireSphere: Belirtiğimiz konumda, belirttiğimiz yarıçapa sahip bir küre oluşturur. Diğer Wire fonksiyonlarında olduğu gibi yüzey gözükmez. 3 eksene paralel şekilde 3 adet dairenin birleştirilmesiyle oluşturulmuş bir görünüm elde etmemizi sağlar.
using UnityEngine;
public class DrawWireSphereGizmo : MonoBehaviour {
public float saldiriMesafesi = 5.0f;
void OnDrawGizmosSelected () {
/*
Yapay zeka karakterinizin, saldırıya geçme mesafesini göstermeyi sağlar.
*/
Gizmos.color = Color.white;
Gizmos.DrawWireSphere (transform.position, saldiriMesafesi);
}
}
Böylece Unity Gizmos Sınıfı için de doküman Türkçeleştirmesini gerçekleştirmiş olduk. Eğer dokümanı orjinal dilinde incelemek isterseniz şu link üzerinden erişebilirsiniz. Bunun dışında, diğer Unity bileşenlerine dair bütün türkçe doküman çevirilerimizi de “Unity Özel Bileşenler” kategorimiz altında bulabilirsiniz. Umuyorum ki faydalı olmuştur. Gelecek yazılarda görüşmek dileğiyle.