Unity Eğitim
Dersler
Forum Sınav Merkezi Premium 💎
C# Dersleri

Unity UI'da Seçili Nesneyi Yönetme: currentSelectedGameObject

Paylaşan: Unity Eğitim 21 October 2025 8 dakika okuma 60 görüntülenme

Unity ile oyun geliştirirken, kullanıcı arayüzü (UI) etkileşimleri oyun deneyiminin kritik bir parçasıdır. Özellikle menülerde, envanter sistemlerinde veya interaktif ekranlarda hangi UI öğesinin aktif olduğunu bilmek ve bunu programatik olarak kontrol etmek büyük önem taşır. İşte tam bu noktada Unity'nin EventSystem.current.currentSelectedGameObject özelliği devreye girer. Bu makalede, bu güçlü aracı derinlemesine inceleyecek, nasıl kullanıldığını açıklayacak ve Unity UI Etkileşimi üzerinde tam kontrol sağlamanıza yardımcı olacak pratik ipuçları sunacağız.

EventSystem Nedir ve Neden Önemlidir?


Unity'deki EventSystem, UI öğeleriyle etkileşimi yöneten merkezi bir bileşendir. Tıklamalar, sürüklemeler, fare hareketleri ve klavye/gamepad navigasyonu gibi tüm giriş olaylarını işler. Sahnenize bir Canvas eklediğinizde, Unity otomatik olarak bir EventSystem nesnesi de ekler. Bu sistem, UI öğelerinizin doğru bir şekilde yanıt vermesini sağlayan Input Modülleri (örneğin, Standalone Input Module) ve Raycaster'lar (örneğin, Graphic Raycaster) gibi bileşenleri barındırır.

EventSystem olmadan, UI öğeleriniz giriş olaylarına tepki veremezdi. Klavyeyle menülerde gezinme, bir butona gamepad ile basma veya bir slider'ı fareyle sürükleme gibi temel Unity UI Etkileşimi, bu sistem tarafından sağlanır. currentSelectedGameObject ise, bu sistemin o an hangi UI öğesini 'seçili' olarak kabul ettiğini gösteren anahtar bir özelliktir.

currentSelectedGameObject'i Anlamak


currentSelectedGameObject, EventSystem tarafından o an odaklanılmış veya seçilmiş olarak kabul edilen GameObject'i temsil eder. Genellikle bu, bir klavye ok tuşuyla veya gamepad ile gezindiğinizde vurgulanan butonu, slider'ı veya input alanı gibi bir UI öğesidir. Ancak, fare ile bir butona tıkladığınızda da o buton kısa bir süreliğine seçili hale gelebilir.

Bu özellik, bir GameObject'in yalnızca bir UI öğesi (yani bir Selectable bileşeni - Button, Toggle, Slider, InputField vb. içeren) olduğunda anlamlıdır. Bir currentSelectedGameObject değeri elde etmek için basitçe EventSystem.current.currentSelectedGameObject kodunu kullanırız. Eğer hiçbir UI öğesi seçili değilse, bu özellik null değerini döndürür.

Kullanım Senaryoları



  • Hangi Düğmenin Aktif Olduğunu Bulma: Bir menüde oyuncunun hangi butonda durduğunu veya en son hangi butona tıkladığını öğrenmek için.

  • Menüler Arası Geçişte Seçimi Koruma: Alt menülere girip çıktıktan sonra ana menüdeki son seçili butona geri dönmek.

  • Özel UI Navigasyon Sistemleri: Varsayılan klavye/gamepad navigasyonunu değiştirmek veya genişletmek için.

  • Giriş Alanı Odaklama: Bir hata mesajı gösterdikten sonra ilgili input alanını otomatik olarak seçmek.


Programatik Olarak Seçim Yapma


Sadece seçili nesneyi okumakla kalmaz, aynı zamanda EventSystem üzerinden programatik olarak bir UI öğesini seçili hale getirebilirsiniz. Bu, özellikle sahne yüklendiğinde belirli bir butonun varsayılan olarak seçilmesini istediğinizde veya bir menüden diğerine geçerken belirli bir öğeyi vurgulamak istediğinizde çok kullanışlıdır.
using UnityEngine; 
using UnityEngine.EventSystems;
using UnityEngine.UI;

public class UISelectionManager : MonoBehaviour
{
public Button defaultButton; // Inspector'dan atanacak varsayılan buton

void Start()
{
// Sahne yüklendiğinde varsayılan butonu seçili hale getir.
if (defaultButton != null)
{
EventSystem.current.SetSelectedGameObject(defaultButton.gameObject);
}
}

void Update()
{
// Hangi GameObject'in seçili olduğunu sürekli kontrol etmek (dikkatli kullanılmalı)
if (EventSystem.current.currentSelectedGameObject != null)
{
Debug.Log("Şu an seçili olan: " + EventSystem.current.currentSelectedGameObject.name);
}
else
{
Debug.Log("Hiçbir UI öğesi seçili değil.");
}

// 'Escape' tuşuna basıldığında seçimi temizle
if (Input.GetKeyDown(KeyCode.Escape))
{
EventSystem.current.SetSelectedGameObject(null);
}
}
}


Yukarıdaki örnekte, Start metodunda bir butonun nasıl varsayılan olarak seçildiğini ve Update metodunda mevcut seçimi nasıl kontrol edebileceğinizi görebilirsiniz. SetSelectedGameObject(null) çağrısı ise mevcut seçimi temizler.

Pratik İpuçları


1. Giriş Odaklamayı Kontrol Altına Alma


Bir sahne yüklendiğinde veya bir menü açıldığında, oyuncunun hemen etkileşime geçebileceği bir UI öğesini seçili hale getirmek iyi bir kullanıcı deneyimi sunar. Örneğin, bir ana menü açıldığında "Başlat" butonunu otomatik olarak seçili hale getirebilirsiniz. Bunu bir önceki kod bloğundaki Start() metodu ile kolayca yapabilirsiniz. Bu, özellikle gamepad veya klavye kullanan oyuncular için Unity UI Etkileşiminin akıcılığını artırır.

2. Seçim Kaybını Yönetme


Bazen kullanıcı UI dışına tıklar veya klavyeyle navigasyon yaparken hiçbir öğe seçili kalmaz. Bu durumda currentSelectedGameObject null olur. Eğer oyununuzun belirli bir UI öğesinin her zaman seçili kalmasını istiyorsanız (örneğin, bir envanter ekranında), Update içinde currentSelectedGameObject'in null olup olmadığını kontrol edip, eğer null ise varsayılan bir öğeyi tekrar seçebilirsiniz.
void Update()
{
if (EventSystem.current.currentSelectedGameObject == null)
{
// Eğer hiçbir şey seçili değilse, varsayılan butonu tekrar seç
if (defaultButton != null)
{
EventSystem.current.SetSelectedGameObject(defaultButton.gameObject);
}
}
}

3. Seçili Öğeyi Görselleştirme/Vurgulama


Seçili öğeyi görsel olarak vurgulamak, oyuncunun hangi öğe üzerinde işlem yapacağını anlamasına yardımcı olur. Unity'nin Selectable bileşenleri zaten vurgulama (Highlight) renkleri veya sprite geçişleri gibi yerleşik özelliklere sahiptir. Ancak daha özel bir görsel efekt uygulamak isterseniz, currentSelectedGameObject'i kontrol ederek seçili öğeye özel bir animasyon, renk değişikliği veya çerçeve ekleyebilirsiniz. Örneğin, seçili butona özel bir ışık efekti ekleyen bir script yazabilirsiniz.

4. Özel Navigasyon Mantığı Oluşturma


Selectable bileşenleri, varsayılan olarak otomatik navigasyon modlarına (Horizontal, Vertical, Explicit) sahiptir. Ancak bazen daha karmaşık bir navigasyon akışı isteyebilirsiniz. Bu durumda, Selectable'ın Navigation modunu None olarak ayarlayabilir ve currentSelectedGameObject'i kullanarak kendi özel navigasyon mantığınızı yazabilirsiniz. Örneğin, belirli bir koşul altında farklı bir menüye geçiş yapabilir veya belirli bir tuşa basıldığında farklı bir öğeyi seçili hale getirebilirsiniz.

Yaygın Hatalar ve Çözümleri


Hata: currentSelectedGameObject'in null olması


Sebep: Hiçbir UI öğesi seçili değilse veya sahnedeki EventSystem doğru yapılandırılmamışsa. Kullanıcı UI dışına tıklamış veya navigasyon sırasında hiçbir öğe odaklanmamış olabilir.

Çözüm: currentSelectedGameObject'i kullanmadan önce her zaman null kontrolü yapın. Eğer null ise, varsayılan bir öğeyi seçmeyi düşünebilirsiniz (bkz. Pratik İpuçları).

if (EventSystem.current.currentSelectedGameObject != null)
{
// Güvenli bir şekilde kullanın
}

Hata: UI dışındaki nesneleri seçmeye çalışmak


Sebep: EventSystem ve currentSelectedGameObject, Unity'nin UI sistemine özgüdür. Dünya üzerindeki 3D nesneleri seçmek için tasarlanmamıştır.

Çözüm: 3D nesnelerle etkileşim için Raycasting veya Collider tabanlı sistemler kullanın. EventSystem'i sadece UnityEngine.UI namespace'indeki öğelerle sınırlı tutun.

Hata: EventSystem nesnesinin sahnede olmaması


Sebep: Bazen geliştiriciler yanlışlıkla EventSystem nesnesini sahneden silebilirler.

Çözüm: Yeni bir Canvas oluşturduğunuzda EventSystem otomatik olarak eklenir. Eğer sahnenizde yoksa, Hierarchy penceresinde sağ tıklayarak UI -> Event System seçeneğini kullanarak manuel olarak ekleyebilirsiniz.

Hata: Seçili öğeyi sürekli Update içinde kontrol etmek


Sebep: Update döngüsü her kare çalıştığı için, sürekli olarak currentSelectedGameObject'i sorgulamak gereksiz CPU yüküne neden olabilir, özellikle de bu sorgunun sonucuna göre karmaşık işlemler yapılıyorsa.

Çözüm: Mümkünse, olay tabanlı sistemleri kullanın. Örneğin, ISelectHandler ve IDeselectHandler arayüzlerini uygulayarak bir UI öğesi seçildiğinde veya seçimi kaldırıldığında tetiklenen metodları kullanabilirsiniz. Bu, sadece ihtiyaç duyulduğunda kodunuzun çalışmasını sağlar ve daha verimli bir Unity UI Etkileşimi yönetimi sunar.

Performans ve Optimizasyon Notları


EventSystem.current.currentSelectedGameObject'in kendisi genellikle bir performans darboğazı yaratmaz. Ancak, bu özelliği her karede (Update metodunda) sürekli sorgulayıp sonucuna göre karmaşık ve pahalı işlemler yapmak performansı olumsuz etkileyebilir. Yukarıda da belirtildiği gibi, mümkün olduğunca olay tabanlı yaklaşımları tercih edin (örneğin, OnSelect, OnDeselect gibi arayüzler). Eğer Update içinde kontrol etmeniz gerekiyorsa, sadece gerçekten ihtiyaç duyduğunuzda bu sorguyu yapmaya özen gösterin ve sonucuna göre yapılan işlemleri optimize edin.

Sonuç


EventSystem.current.currentSelectedGameObject, Unity UI sisteminde güçlü ve esnek bir araçtır. UI öğelerinin seçilme durumunu programatik olarak okumanıza ve değiştirmenize olanak tanır. Bu özelliği doğru bir şekilde anlayıp kullanarak, daha akıcı, daha sezgisel ve daha kontrol edilebilir bir Unity UI Etkileşimi deneyimi sunabilirsiniz. Gerek varsayılan seçimleri ayarlamak, gerekse özel navigasyon mantığı oluşturmak için bu özellik, UI geliştirme sürecinizde size büyük kolaylıklar sağlayacaktır. Unutmayın, iyi bir kullanıcı arayüzü, oyuncunun oyunla olan etkileşimini doğrudan etkiler ve currentSelectedGameObject bu etkileşimi zenginleştirmenin anahtarlarından biridir.

🧠 Ders Sonu Değerlendirme Testi

Dersi tamamladıktan sonra bilgilerinizi test edin ve ekstra puanlar kazanın.

🔥 +50 XP Ödül
🔒

Sınava Katılmak İçin Giriş Yapın

Bu ders sonu testini çözebilmek, bilginizi test edip **+50 XP** kazanmak ve **Sınav Şampiyonu** rozetinin kilidini açmak için üye girişi yapmalısınız.

Yorumlar (0)

Yorum yazabilmek ve derslere katkıda bulunabilmek için giriş yapmalısınız.

İlk yorumu siz yapın!