Unity3D Editor Log Kullanımı

Bugün Unity3D içerisinde çıktı aldığımız zaman dosya boyutumuzla ilgileneceğiz. Unity3D ile proje oluştururken “Asset Store” üzerinden veya farklı kaynaklardan proje içerisine bir çok “Asset” dahil etmiş olabiliriz. Bunların içerisinde çok fazla dosya olabilir ancak biz bunlardan birkaçını kullanabiliriz. Yani proje dosyamız gb boyutlarında olabilir ancak çıktı aldığımız zaman bu boyut mb olabilir. Bunun en temel sebebi, Unity3D dosyaları çıktı dosyası içerisine eklerken tamamen projeyi eklemek yerine kullanılan ve o kullanılan dosyaya gerekli dosyaları ekliyor. Hatta bunun yanı sıra bazı sahneler oluşturmuş olabiliriz ve bu sahneleri “Build Settings” altında eklemediysek onları da çıktı dosyası içerisine eklememekte. Böylelikle çıktı dosyamızın boyutu küçülüyor.
Okumaya devam et Unity3D Editor Log Kullanımı

Unity3D PlayerPrefs Kullanımı

Bugün Unity3D ile C# kullanarak “PlayerPrefs” yapısına bakacağız. Genel olarak farklı oyun motorlarında veya native kodlama yapısında bu yapı değişik isimlerle mevcut. Burada Unity3D içerisinde bakacağız.
Oyunlarımızda her hangi bir giriş anında veya her hangi bir sahnede yapılmış sonuçları daha sonraki girişler de veya diğer sahnelerde kullanmak isteyebiliriz. Örneğin bir sahnemizde top ile elmas topladık ve diğer sahnede bunu toplam elmas değerini göstermek istiyoruz. Normal durumda o sahnede toplanan elmaslar sahne kapatılınca değişkenin değeri gideceği için daha sonra öğrenemeyiz. Ancak bunu bir “PlayerPrefs” ile birlikte cihazın hafızasında tutarsak daha sonra o değerlere erişmemiz mümkün olur.
Okumaya devam et Unity3D PlayerPrefs Kullanımı

Unity3D UI Sistemi Çapa Noktaları Yapısı

Bu yazımda kısaca Unity3D versiyon 4.6’dan sonra gelen “UI(User Interface)” yapısına bakacağız. Bununla birlikte çok sık olarak karşılaştığım “UI yapısının her telefonda aynı görünmesi” durumuna bakacağız. Kullanışlı ve temel olarak basit bir yapıdır.
Okumaya devam et Unity3D UI Sistemi Çapa Noktaları Yapısı

Unity3D Inspector Özellikleri – 2 Menu Yapımı

Merhaba, bir önceki yazımda kullanılabilecek temel yapılardan bahsetmiştim. Şimdi “inspector” paneli üzerinden bir menü yapacağız.
Menü yapımına geçmeden önce küçük bir şeyden bahsetmek istiyorum. Bir görsel öğe kullanmak istediğimiz zaman “public” olarak bir değişken tanımlayıp, o değişkene Unity arayüzü üzerinden görsel öğeyi sürükleyerek göstermek istediğimiz yerde gösterebiliriz. Eğer kullanacağımız görsel farklı sahnelerde değişmeden kalacak ise bunu doğru klasörlere yerleştirerek yapabiliriz.
Projemizin ana dizini içerisine “Resources” adında bir klasör oluşturarak kullanacağımız görseli içerisine atalım. C# script içerisinde bir adet “Texture2D” değişkeni tanımlayalım. Bu değişkeni “private” yapacağız. Daha sonra C# script içerisinde “Awake” fonksiyonunda “Resources” sınıfının “Load” metodu ile ilk parametre klasör içerisindeki görselin ismi, ikinci parametre ise değişkenin tipi olacak şekilde kullanalım ve “private” tanımladığımız değişkene atama yapalım.

Burada bir de “as” yapısı var. Bu dönüştürme işlemi yapmakta. Eğer dönüştürme mümkün olmazsa “null” döndürmekte.
Artık menü yapacağımıza göre “MonoBehaviour” sınıfı yerine “Editor” sınıfını “extend” ediyoruz. Tabi burada “using UnityEditor” eklemeyi unutmuyoruz. Yukarıda “Resources” klasörü oluşturmadan bahsetmiştim. “Inspector” üzerinde Editor yapılarını kullanabilmek içinde “Editor” adında bir klasör oluşturarak, scripti içerisine atmamız gerekmekte. İsmini “Menu.cs” yaptım.
Bir sınıfa “Editor” sınıfını “extend” edersek o script yapısını her hangi bir “GameObject” yapısı üzerine koyamayız. Bunun için “Editor” script yapısı ile başka bir scripti yönetmemiz gerekmekte. İlk olarak bu işlemi yapmak için Unity arayüz üst tarafına bir menü yerleştireceğiz.
Bir önceki yazımda da örneklerinden bahsettiğim gibi ek olarak “MenuItem” yapısına bakalım. Bu yapı Unity arayüzünün üst tarafına yeni bir menü eklememizi sağlamakta. Aralarına “/” koyarak yan yana açılan bir menü yapısı elde edebiliyoruz. Örneğin;

Bu yapıyı bir metot üzerine yazıyoruz. Tıklandığı zaman altına yazılmış olan metod çalışmakta. Biz buna basıldığı zaman seçili olan obje üzerine yeni oluşturacağımız “MainScript.cs” i ekleyelim. MainScript;

Şimdi, Menu.cs script içerisine alttaki kodu ekleyelim.

Buradaki kodu biraz inceleyelim. Öncelikle “Selection.activeGameObject”, hiyerarşi paneli üzerinden seçilen “gameobject” yapısını döndürmekte. Eğer böyle bir obje seçilmemiş ise ilk koşula girecek seçilir ise “else” durumuna girecek. Eğer seçildiyse ve üzerinde “MainScript” yok ise eklemek için soru soracak ve “Yes” durumunda eklenecek.
Burada kullanmış olduğumuz “DisplayDialog” yapısına da bakalım. Kullanılan 2 tür yapısı mevcut. Bir tanesi 3 farklı parametre almakta; başlık, içerik ve bir adet buton. Butona basılınca koşula girebilmekte. İkinci türü ise 4 farklı parametre almakta; başlık, içerik, buton1, buton2 olarak. Buton1 ‘e basılırsa koşula girebilmekte yani “true” dönmekte.
Şimdi “inspector” panelini kontrol edeceğimiz yapı olan “OnInspectorGUI()” metoduna bakalım. Eklediğimiz “MainScript” üzerinde “inpsector” panelinde yapıları kontrol etmemizi sağlamakta. Biz bu örneğimizde 3 tane buton koyarak butonlara tıklandığı zaman alt taraflarında yeni menüler açacağız.
Öncelikle yerleştirme işlemi için “EditorGUILayout.BeginHorizontal()” ile yatay olarak “layout” oluşturabiliriz. Bitirmek içinde “EditorGUILayout.EndHorizontal()” yazmamız gerekmekte. Şimdi bunların içerisine buton eklemek için “GUILayout.Button()” yapısını kullanacağız. Tıklandığı zaman “true” döndürmekte. Buraya kadar olan script yapısı aşağıda.

Artık elimizde tıklandığını bildiğimiz “boolean” değişkenler bulunmakta. Bu değişkenlere göre işlemler yapabiliriz. Yorum satırının hemen altından devam edelim,

Burada 2 yeni yapı kullandık. Birincisi “HelpBox”, 2 parametre almakta. İlk parametresi yazacak olan değer, ikinci parametresi ise sol tarafında görünecek olan işaret. İkinci olarak “Space”, koyulduğu yere boşluk bırakmakta.
Son olarak o kadar “MainScript” oluşturduk içerisinde ki değişkene bu panel üzerinden müdahale etmezsek olmaz :). “MainScript” içerisine bir tane “bool” değişken tanımlıyoruz ve “public” olmalı.

Şimdi, bu değişkenlere erişirken “serializedObject” yapısını kullanacağız. 2 temel metodu üzerinde yoğunlaşacağız. “OnInspectorGUI” metodu içerisine en başına “serializedObject.Update()” ve en sonuna da “serializedObject.ApplyModifiedProperties()” ekliyoruz.
Menu1 yapısının içerisine “PropertyField” ekleyelim. Biz iki parametreli olan yapısını kullanalım. Birinci parametre olarak “serializedObject.FindProperty()” ile diğer script içerisinde tanımladığımız “valueBool” değişkeninin özellikleri alalım. İkinci parametre olarak onun sol tarafında yazacak olan açıklamayı girelim.
EditorGUILayout.PropertyField(serializedObject.FindProperty(“valueBool”), new GUIContent(“Boolean Value”));

Örnek olması açısından bir tane tam sayı ve bir tane “string” değer tanımlayalım.
MainScript

Menu

Birazda ekran görüntüsü
image-9-1

image-9-2
Teşekkürler, görüşmek üzere.

Unity3D Inspector Özellikleri – 1

Merhaba, bu yazımda Unity3D içerisinde ki “Inspector” alanında değişkenlerin yanında ekstra özellikler kullanmaya bakacağız. Bu yazıda kullanmış olduğum temel yapılardan bahsedeceğim. C# kullanmaktayım.
HideInInspector
Unity içerisinde C# yazarken “private” ve “public” değişken kullanırken biraz farklılık bulunmakta. “private” değişken “Inspector” panelinde görünmüyor ve Unity arayüzü üzerinden değiştirilemiyor. “public” değişken ise “Inspector” panelinde görünüyor ve Unity arayüzü ile değiştirmek mümkün. Ayrıca “private” değişken demek diğer script yapılarından o değişkene ulaşamamak demek. Bazen bir değişkenin Unity arayüzünde görünmesin ama başka bir script üzerinden o değişkene ulaşılmasını isteyebiliriz. Tabi bunu “getter-setter” metodlar ile de yapabiliriz. Eğer “getter-setter” metodları kullanmadan yapmak istersek, değişkenin önüne “[HideInInspector]” yazabiliriz.
Header
“Inspector” paneli içerisinde bir script içerisinde ki bir değişkene veya birden fazla değişkenin üzerine açıklama tarzında bir başlık eklememizi sağlamakta. Parametre olarak içerisine string bir değer almakta. Kullanımı ise, “[Header(“Header”)]” şeklindedir.
Space
Eğer “Inspector” paneli üzerinde iki değişken arasında boşluk bırakmak isterseniz “Space” yapısını kullanabilirsiniz. Parametre olarak float değer almakta. Kullanımı ise, “[Space(20.5f)]” şeklindedir.
Range
Eğer bir değişkenin belli bir değerler arasında değer almasını istiyorsak “Range” yapısını kullanabiliriz. İki farklı kullanım durumu var. Eğer altına yazdığımız değişken int tipinde ise “[Range(0, 5)]” şeklinde yazarak tam sayı olarak değişmesini sağlayabiliriz. İkinci alternatif olarak altına yazılan değer float tipinde ise “[Range(0f, 5f)]” şeklinde yazarak değerlerin virgüllü şekilde hareket etmesini sağlayabiliriz.
Tooltip
“Inspector” üzerinde bir değişkenin üzerine gelindiği zaman bir açıklama göstermek istersek “Tooltip” yapısını kullanabiliriz. Parametre olarak string bir değer almakta. Kullanım şekli ise, “[Tooltip(“Açıklama”)]”.
RequireComponent
Yukarıda incelediklerimiz dışında bu yapı biraz farklı. Öncelikle yukarıdakiler bir değişken için özel durumları ifade ediyordu. Bu yapı ise bir script için yazılmakta. Örneğin, script içerisinde o objeye ait “Rigidbody” değerini alacaksınız, eğer obje üzerinde “Rigidbody” eklenmemiş ise “GetComponent” ile alırken null olarak gelecek. Bunun önüne geçmek için o class üzerine “RequireComponent” ile “Rigidbody” ekliyoruz ve Unity arayüzünde scripti attığımız objeye otomatik olarak “Rigidbody” ekleniyor. Kullanımı ise, “[RequireComponent(typeof(Rigidbody))]”
Serializable
Son olarak “Serializable” yapısına bakalım. Script üzerinde bir tane sınıf yazdık ve bu sınıfın değerlerini arayüz üzerinden değiştirmek istiyoruz. Bir dizi yapısı kullanarak arayüz de göstermeye çalışırsak bu değişken görünmez. Göstermek için ise yazdığımız sınıfın üstüne “[Serializable]” eklememiz gerekmekte. Burada ek olarak kullandığımız yapı “System” altına yani “using System” olarak eklememiz gerekiyor.
Yanlış bilgi vermemeye çalışmak adına yazarken test ettiğim scriptin de arayüz içerisinden ekran görüntüsü ve scripti paylaşayım.
image-8-1

Teşekkürler, görüşmek üzere.