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;
|
[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;
|
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ı.
|
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
|
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.