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ındaGetComponent()gibi metotları kullanmak yerine, referanslarıAwake()veyaStart()metodunda önbelleğe alın (yukarıdaki örnektehedefResimdeğişkeni gibi). - Bellek Ayırmaları: Özellikle sık tetiklenen olaylarda (ki
OnSelectbu 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. AncakOnSelectö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.



