Unity’de UI Seçimini Yönetme: ISelectHandler ve OnSelect()

Unity'de ISelectHandler arayüzünü kullanarak UI elemanlarının seçilme olaylarını nasıl yöneteceğinizi öğrenin. OnSelect() ile etkileşimli menüler ve formlar oluşturun.

Unity, oyun ve uygulama geliştiricilerine güçlü bir kullanıcı arayüzü (UI) sistemi sunar. Bu sistemin kalbinde, kullanıcı etkileşimlerini yönetmek için kullanılan çeşitli arayüzler bulunur. Bu makalede, Unity UI Etkinlikleri arasında önemli bir yere sahip olan ISelectHandler arayüzünü ve bu arayüzün temel metodu olan OnSelect()‘i detaylı bir şekilde inceleyeceğiz. Özellikle menü navigasyonu, form odaklama ve genel UI etkileşimlerinde bu arayüzün nasıl kullanılacağını, pratik ipuçları ve yaygın hatalarla birlikte ele alacağız.

ISelectHandler ve OnSelect() Nedir?

ISelectHandler, Unity’nin Event System (Olay Sistemi) tarafından tanınan bir arayüzdür. Bu arayüzü uygulayan bir script, bir UI elemanının seçildiği (odaklandığı) zaman belirli bir işlemi gerçekleştirmek için kullanılır. Bir UI elemanı seçildiğinde, Unity Event System otomatik olarak bu arayüzü uygulayan tüm bileşenlerdeki OnSelect() metodunu çağırır.

OnSelect(BaseEventData eventData) metodu, bir UI elemanının klavye, gamepad, fare tıklaması veya programatik olarak seçilmesiyle tetiklenir. Bu, genellikle bir menüde bir düğmenin vurgulanması, bir metin giriş alanının odaklanması veya bir listenin belirli bir öğesinin seçilmesi gibi durumlar için idealdir. BaseEventData parametresi, olayın tetiklenme şekli hakkında ek bilgiler sağlar, ancak çoğu zaman basit seçim durumlarında doğrudan kullanılmayabilir.

Temel Kullanım Alanları ve Çalışma Prensibi

ISelectHandler‘ın çalışabilmesi için sahnede bir EventSystem objesinin bulunması ve seçilebilir UI elemanınızın üzerinde bir Selectable bileşeninin (örneğin Button, Toggle, Slider, InputField) veya özel bir scriptin bu seçilebilirliği yönetmesi gerekir. Selectable bileşeni, UI elemanının nasıl etkileşim kuracağını (vurgulanma, basılma, seçilme durumları) tanımlar ve navigasyon ayarlarını içerir.

Bir GameObject‘e ISelectHandler arayüzünü uygulayan bir C# scripti eklediğinizde, bu script artık Unity Event System tarafından algılanır. Örneğin, bir butona tıklandığında veya klavye ile üzerine gelindiğinde (seçildiğinde) özel bir görsel geri bildirim sağlamak isteyebilirsiniz. İşte basit bir örnek:

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class SecimGeriBildirimi : MonoBehaviour, ISelectHandler, IDeselectHandler
{
    public Color seciliRenk = Color.yellow;
    public Color normalRenk = Color.white;

    private Image hedefResim;

    void Awake()
    {
        hedefResim = GetComponent();
        if (hedefResim == null)
        {
            Debug.LogWarning("Hedef Resim bileşeni bulunamadı. Lütfen bir Image bileşeni ekleyin.");
            enabled = false; // Bileşen yoksa script'i devre dışı bırak.
        }
    }

    public void OnSelect(BaseEventData eventData)
    {
        if (hedefResim != null)
        {
            hedefResim.color = seciliRenk;
            Debug.Log(gameObject.name + " seçildi!");
        }
    }

    public void OnDeselect(BaseEventData eventData)
    {
        if (hedefResim != null)
        {
            hedefResim.color = normalRenk;
            Debug.Log(gameObject.name + " seçimi kaldırıldı.");
        }
    }
}

Yukarıdaki örnekte, script’i bir Button veya Image bileşeni olan bir GameObject‘e eklediğinizde, eleman seçildiğinde rengi sarıya dönecek, seçimi kaldırıldığında ise beyaza dönecektir. Bu, Unity UI Etkinlikleri ile görsel geri bildirim sağlamanın en temel yollarından biridir.

Pratik İpuçları

1. Görsel ve İşitsel Geri Bildirim Sağlama

Kullanıcı deneyimi (UX) açısından, bir UI elemanı seçildiğinde görsel veya işitsel bir geri bildirim sağlamak çok önemlidir. OnSelect() metodu içinde bir animasyon tetikleyebilir, bir ses efekti çalabilir veya elemanın boyutunu/rengini değiştirebilirsiniz. Bu, kullanıcının hangi elemanın odaklandığını kolayca anlamasına yardımcı olur. Örneğin, bir menüdeki buton seçildiğinde hafifçe büyümesini sağlayabilirsiniz.

public void OnSelect(BaseEventData eventData)
{
    // Ölçek animasyonu başlat
    transform.localScale = new Vector3(1.1f, 1.1f, 1.1f);
    // Ses efekti çal (varsa)
    // AudioManager.Play("SelectSound");
}

2. Programatik Olarak UI Elemanı Seçme

Bazen bir UI elemanının belirli bir olay sonrası (örneğin bir form gönderildikten sonra) otomatik olarak seçilmesini isteyebilirsiniz. Bunu EventSystem.current.SetSelectedGameObject() metodu ile yapabilirsiniz. Bu özellikle bir sahne yüklendiğinde veya bir menü açıldığında varsayılan bir elemanın seçilmesini sağlamak için kullanışlıdır.

using UnityEngine;
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class UIYoneticisi : MonoBehaviour
{
    public GameObject ilkSecilecekEleman;

    void Start()
    {
        // Sahne yüklendiğinde ilk butonu otomatik olarak seç.
        if (ilkSecilecekEleman != null && EventSystem.current != null)
        {
            EventSystem.current.SetSelectedGameObject(ilkSecilecekEleman);
        }
    }
}

Bu script’i sahnenizdeki herhangi bir GameObject‘e ekleyip, ilkSecilecekEleman değişkenine seçmek istediğiniz UI elemanını (örneğin bir buton) atayarak kullanabilirsiniz.

3. IDeselectHandler ile Birlikte Kullanım

ISelectHandler arayüzü genellikle IDeselectHandler arayüzü ile birlikte kullanılır. IDeselectHandler‘ın OnDeselect() metodu, bir UI elemanının seçimi kaldırıldığında tetiklenir. Bu ikilinin birlikte kullanımı, elemanın seçildiğinde ve seçimi kaldırıldığında farklı durumlar arasında geçiş yapmasını sağlar. Yukarıdaki ilk kod örneğimizde bu kullanım zaten gösterilmiştir.

Yaygın Hatalar ve Çözümleri

1. EventSystem Eksikliği

Hata: OnSelect() metodu asla tetiklenmiyor.
Çözüm: Sahnede bir EventSystem GameObject’inin olup olmadığını kontrol edin. Eğer yoksa, sağ tıklayıp UI -> Event System seçeneğini kullanarak bir tane ekleyin. Unity’nin Canvas oluştururken otomatik olarak bir EventSystem eklediğini unutmayın, ancak yanlışlıkla silinmiş olabilir.

2. Selectable Bileşeni Eksikliği veya Yanlış Yapılandırma

Hata: UI elemanı seçilebilir değil veya navigasyon çalışmıyor.
Çözüm: ISelectHandler‘ı uyguladığınız GameObject üzerinde bir Selectable bileşeninin (Button, Toggle, InputField vb.) bulunduğundan emin olun. Eğer özel bir UI elemanı ise, kendi Selectable türevi bileşeninizi oluşturmanız veya seçilebilirliği manuel olarak yönetmeniz gerekebilir. Ayrıca, Selectable bileşeninin Interactable özelliğinin işaretli olduğundan ve navigasyon ayarlarının (Navigation bölümü) doğru yapılandırıldığından emin olun.

3. Diğer Event Handler’lar ile Çakışma

Hata: OnSelect() bazen beklenenden farklı zamanlarda tetikleniyor veya diğer olaylarla karışıyor.
Çözüm: OnSelect(), bir elemanın *odaklandığı* zaman tetiklenir, bir elemana *tıklandığı* zaman değil. Tıklama olayları için IPointerClickHandler ve OnPointerClick() metodunu kullanmalısınız. Bir Button bileşeni hem IPointerClickHandler hem de ISelectHandler davranışlarını içerir. Fare ile tıklamak hem OnPointerClick‘i hem de elemanın seçilmesini tetikleyebilir. Klavye veya gamepad ile navigasyon ise sadece OnSelect‘i tetikler.

Performans ve Optimizasyon Notları

OnSelect() metodu, genellikle UI etkileşimleri sırasında nispeten seyrek tetiklenen bir olaydır. Bu nedenle, bu metodun kendisi genellikle performans sorunlarına yol açmaz. Ancak, OnSelect() içinde yaptığınız işlemlerin maliyetine dikkat etmelisiniz:

  • Yoğun Hesaplamalar: OnSelect() içinde ağır matematiksel hesaplamalar veya karmaşık algoritmalar çalıştırmaktan kaçının. Bu tür işlemler, UI’da takılmalara veya yavaşlamalara neden olabilir.
  • Sık GetComponent Çağrıları: Her OnSelect() çağrısında GetComponent() gibi metotları kullanmak yerine, referansları Awake() veya Start() metodunda önbelleğe alın (yukarıdaki örnekte hedefResim değişkeni gibi).
  • Bellek Ayırmaları: Özellikle sık tetiklenen olaylarda (ki OnSelect bu kategoriye pek girmez), gereksiz bellek ayırmalarından (garbage collection) kaçınmak için yeni nesneler oluşturmaktan veya string manipülasyonları yapmaktan kaçınmak faydalı olabilir. Ancak OnSelect özelinde bu genellikle büyük bir sorun teşkil etmez.

Genel olarak, Unity UI Etkinlikleri ile çalışırken performans, genellikle animasyonların veya karmaşık UI hiyerarşilerinin render maliyetinden kaynaklanır. OnSelect() içindeki mantık, çoğu durumda çok küçük bir performans yükü oluşturacaktır.

Sonuç

ISelectHandler ve OnSelect() metodu, Unity UI elemanlarınızın seçilme durumlarını yönetmek için güçlü ve esnek bir yol sunar. Menü navigasyonundan form odaklamaya kadar birçok senaryoda kullanıcı deneyimini zenginleştirmek için bu arayüzü kullanabilirsiniz. Doğru uygulama ve yaygın hatalardan kaçınarak, etkileşimli ve kullanıcı dostu arayüzler geliştirebilirsiniz. Unutmayın, etkili Unity UI Etkinlikleri yönetimi, oyununuzun veya uygulamanızın genel kalitesini önemli ölçüde artırır.

Leave a Reply

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir