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ı
Etiket: Unity
Unity3D ile 2D Geliştirmede Ekran Boyutlandırması
Bugün Unity3D içerisinde 2D olarak oyun geliştirirken oyun içerisinde “Sprite” yapılarının her cihazda aynı şekilde görüntülenmesine bakacağız. Genel olarak Android cihazların sayısı oldukça fazla. Bununla birlikte birbirinden farklı ekran çözünürlükleri kullanılıyor. Bu demek oluyor ki, bir oyun yapmaya başladığımız zaman oyunumuz farklı ekran çözünürlüklerinde oynanacak. Örneğin oyunda bir arka plan için bir “Sprite” koyduğumuzda her cihazda yatay ve dikey olarak kaplamasını isteyebiliriz. Yani ekranın sağında ve solunda boşluklar olması ya da altında veya üstünde boşlukların bulunması istenmeyen bir durum oluyor.
Okumaya devam et Unity3D ile 2D Geliştirmede Ekran Boyutlandırması
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 Inspector Özellikleri – List Yapısı
Merhaba, bu yazımda Unity3D içerisinde “Inspector Panel” özelleştirilirken kullanmamız gerekebilen liste yapısı eklemeye bakacağız.
Öncelikle daha önceki yazılarımda bahsettiğim gibi “Inspector” için kullanılabilen bir script yapısını objenin üzerine sürükle bırak ile bırakamıyoruz. Sebebi oluşturacağımız script yapısını “Editor” sınıfından türetmiş olmamızdır. Bunun için ana dizin içerisinde “Editor” adında bir klasör oluşturalım ve içerisine “Menu.cs” adında bir C# scripti ekleyelim. Daha sonra normal scriptleri koyacağımız bir “Scripts” klasörü oluşturarak içerisine “MainScript.cs” oluşturabiliriz.
Okumaya devam et Unity3D Inspector Özellikleri – List Yapısı
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
using UnityEngine; using System.Collections; using UnityEditor; public class Menu : MonoBehaviour { private Texture2D menuItem1; void Awake() { menuItem1 = Resources.Load("Menu-1", typeof(Texture2D)) as Texture2D; } // Use this for initialization void Start () { } // Update is called once per frame void Update () { } } |
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;
1 |
[MenuItem("Kemal BAKACAK/Test/Add Script")] |
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;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
using UnityEngine; using System.Collections; public class MainScript : MonoBehaviour { // Use this for initialization void Start () { } // Update is called once per frame void Update () { } } |
Şimdi, Menu.cs script içerisine alttaki kodu ekleyelim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
[MenuItem("Kemal BAKACAK/Test/Add Script")] static void CreateBehavior() { if(!Selection.activeGameObject) { EditorUtility.DisplayDialog("Title", "You Need to Select a Gameobject", "Ok"); } else { if (!Selection.activeGameObject.GetComponent<MainScript>()) { Selection.activeGameObject.AddComponent<MainScript>(); if (EditorUtility.DisplayDialog("Title", "Add ?", "Yes", "No")) Debug.Log("Added"); } else { EditorUtility.DisplayDialog("Title", "Your Gameobject Already have", "Ok"); } } } |
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(MainScript))] public class Menu : Editor { private MainScript mainScript; private Texture2D menuItem1; private Texture2D menuItem2; private Texture2D menuItem3; private bool menu1 = false; private bool menu2 = false; private bool menu3 = false; void Awake() { menuItem1 = Resources.Load("Menu-1", typeof(Texture2D)) as Texture2D; menuItem2 = Resources.Load("Menu-2", typeof(Texture2D)) as Texture2D; menuItem3 = Resources.Load("Menu-3", typeof(Texture2D)) as Texture2D; } [MenuItem("Kemal BAKACAK/Test/Add Script")] static void CreateBehavior() { if(!Selection.activeGameObject) { EditorUtility.DisplayDialog("Title", "You Need to Select a Gameobject", "Ok"); } else { if (!Selection.activeGameObject.GetComponent<MainScript>()) { Selection.activeGameObject.AddComponent<MainScript>(); if (EditorUtility.DisplayDialog("Title", "Add ?", "Yes", "No")) Debug.Log("Added"); } else { EditorUtility.DisplayDialog("Title", "Your Gameobject Already have", "Ok"); } } } public override void OnInspectorGUI() { EditorGUILayout.BeginHorizontal(); if (GUILayout.Button(menuItem1)) menu1 = !menu1; if (GUILayout.Button(menuItem2)) menu2 = !menu2; if (GUILayout.Button(menuItem3)) menu3 = !menu3; EditorGUILayout.EndHorizontal(); // ############################# } } |
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,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
if(menu1) { EditorGUILayout.HelpBox("Menu1 is Open", MessageType.Info); EditorGUILayout.Space(); } if (menu2) { EditorGUILayout.HelpBox("Menu2 is Open", MessageType.Info); EditorGUILayout.Space(); } if(menu3) { EditorGUILayout.HelpBox("Menu3 is Open", MessageType.Error); } |
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ı.
1 |
public bool valueBool = false; |
Ş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
1 2 3 4 5 6 7 8 |
using UnityEngine; public class MainScript : MonoBehaviour { public bool valueBool; public int valueInt; public string valueString; } |
Menu
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 |
using UnityEngine; using System.Collections; using UnityEditor; [CustomEditor(typeof(MainScript)), CanEditMultipleObjects] public class Menu : Editor { private MainScript mainScript; private Texture2D menuItem1; private Texture2D menuItem2; private Texture2D menuItem3; private bool menu1 = false; private bool menu2 = false; private bool menu3 = false; void Awake() { menuItem1 = Resources.Load("Menu-1", typeof(Texture2D)) as Texture2D; menuItem2 = Resources.Load("Menu-2", typeof(Texture2D)) as Texture2D; menuItem3 = Resources.Load("Menu-3", typeof(Texture2D)) as Texture2D; } [MenuItem("Kemal BAKACAK/Test/Add Script")] static void CreateBehavior() { if(!Selection.activeGameObject) { EditorUtility.DisplayDialog("Title", "You Need to Select a Gameobject", "Ok"); } else { if (!Selection.activeGameObject.GetComponent<MainScript>()) { Selection.activeGameObject.AddComponent<MainScript>(); if (EditorUtility.DisplayDialog("Title", "Add ?", "Yes", "No")) Debug.Log("Added"); } else { EditorUtility.DisplayDialog("Title", "Your Gameobject Already have", "Ok"); } } } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.BeginHorizontal(); if (GUILayout.Button(menuItem1)) menu1 = !menu1; if (GUILayout.Button(menuItem2)) menu2 = !menu2; if (GUILayout.Button(menuItem3)) menu3 = !menu3; EditorGUILayout.EndHorizontal(); // ############################# if(menu1) { EditorGUILayout.HelpBox("Menu1 is Open", MessageType.Info); EditorGUILayout.PropertyField(serializedObject.FindProperty("valueBool"), new GUIContent("Boolean Value")); EditorGUILayout.PropertyField(serializedObject.FindProperty("valueInt"), new GUIContent("Int Value")); EditorGUILayout.PropertyField(serializedObject.FindProperty("valueString"), new GUIContent("String Value")); EditorGUILayout.Space(); } if (menu2) { EditorGUILayout.HelpBox("Menu2 is Open", MessageType.None); EditorGUILayout.Space(); } if(menu3) { EditorGUILayout.HelpBox("Menu3 is Open", MessageType.Error); } serializedObject.ApplyModifiedProperties(); } } |
Birazda ekran görüntüsü
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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
using UnityEngine; using System; [Serializable] public class Car { public int id; public string name; } [RequireComponent(typeof(Rigidbody))] public class InspectorTest : MonoBehaviour { [HideInInspector] public int number1; [Header("Header")] public int number2; public int number3; [Space(20.5f)] public int number4; [Range(0, 5)] public int number5; [Range(0f, 5f)] public float number6; [Tooltip("Number")] public int number7; private Rigidbody rb; public Car[] cars; // Use this for initialization void Start () { rb = GetComponent<Rigidbody>(); print(rb); } // Update is called once per frame void Update () { } } |
Teşekkürler, görüşmek üzere.