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

Unity'de Fare Konumunu `Input.mousePosition` ile Alma

Paylaşan: Unity Eğitim 02 November 2025 8 dakika okuma 61 görüntülenme

Giriş: Fare Kontrolünün Temelleri

Oyun geliştirme dünyasında, oyuncu etkileşimi çoğu zaman fare veya dokunmatik girişlerle başlar. Unity'de fare konumunu doğru bir şekilde algılamak ve kullanmak, strateji oyunlarından nişancı oyunlarına, hatta kullanıcı arayüzü (UI) etkileşimlerine kadar birçok farklı oyun türü için kritik öneme sahiptir. Bu makalede, Unity'nin temel giriş sistemi olan `Input` sınıfının bir parçası olan `Input.mousePosition` özelliğini derinlemesine inceleyeceğiz.

Unity'de fare konumu bilgisini almak, oyunlarınızda daha dinamik ve interaktif deneyimler yaratmanıza olanak tanır. İster bir objeyi fareyle sürüklemek isteyin, ister fare imlecinin altındaki bir nesneyi tespit etmek isteyin, `Input.mousePosition` başlangıç noktanız olacaktır. Bu makale, temel kullanımdan karmaşık senaryolara kadar Unity fare konumu yönetimini ele alacak ve size pratik ipuçları sunacaktır.

`Input.mousePosition` Nedir ve Nasıl Çalışır?

`Input.mousePosition`, fare imlecinin ekran üzerindeki piksel koordinatlarını döndüren bir `Vector3` yapısıdır. Bu `Vector3`'ün `x` ve `y` bileşenleri, farenin ekran üzerindeki yatay ve dikey konumunu temsil ederken, `z` bileşeni her zaman 0'dır (ekran koordinatları 2 boyutlu olduğundan). Koordinat sistemi şu şekildedir:

  • Ekranın sol alt köşesi: (0, 0)
  • Ekranın sağ üst köşesi: (`Screen.width`, `Screen.height`)

Bu, fare konumunun ekran çözünürlüğüne bağlı olduğu anlamına gelir. Örneğin, 1920x1080 çözünürlüklü bir ekranda, farenin sağ üst köşedeki konumu yaklaşık olarak (1919, 1079) olacaktır.

Temel Kullanım

Fare konumunu almak oldukça basittir. Genellikle bir `MonoBehaviour` betiğinin `Update()` metodunda bu bilgiyi kontrol ederiz çünkü fare konumu her karede değişebilir:

using UnityEngine;

public class FareKonumuOrnegi : MonoBehaviour
{
    void Update()
    {
        // Fare konumunu al
        Vector3 fareEkranda = Input.mousePosition;

        // Konsola yazdır
        Debug.Log("Fare Konumu: " + fareEkranda);
    }
}

Bu kod bloğu, her karede farenin ekran üzerindeki piksel koordinatlarını konsola yazdıracaktır. Ancak çoğu zaman, bu ekran koordinatlarını oyun dünyası (world space) veya UI (User Interface) koordinatlarına dönüştürmemiz gerekir.

Pratik Kullanım Senaryoları ve İpuçları

Unity fare konumu bilgisini farklı senaryolarda nasıl kullanacağımıza dair bazı pratik ipuçları:

İpucu 1: UI Elemanlarını Fare Konumuna Göre Taşıma

UI elemanlarını fareyle sürüklemek veya fare imlecinin konumuna göre hareket ettirmek yaygın bir istektir. Ancak UI, ekran koordinatlarından farklı bir Canvas sisteminde çalıştığı için doğrudan `Input.mousePosition` kullanılamaz. Bunun yerine `RectTransformUtility.ScreenPointToLocalPointInRectangle` metodunu kullanırız:

using UnityEngine;
using UnityEngine.EventSystems;

public class UIDragOrnegi : MonoBehaviour, IPointerDownHandler, IDragHandler
{
    [SerializeField] private RectTransform _rectTransform;
    [SerializeField] private Canvas _canvas;

    void Start()
    {
        if (_rectTransform == null)
            _rectTransform = GetComponent();
        if (_canvas == null)
            _canvas = GetComponentInParent();
    }

    public void OnPointerDown(PointerEventData eventData)
    {
        // Tıklama anında herhangi bir işlem yapılmayabilir, sürükleme için hazırlık.
    }

    public void OnDrag(PointerEventData eventData)
    {
        if (RectTransformUtility.ScreenPointToLocalPointInRectangle(
            _rectTransform.parent as RectTransform, 
            eventData.position, 
            eventData.pressEventCamera, 
            out Vector2 localPoint))
        {
            _rectTransform.localPosition = localPoint;
        }
    }
}

Bu örnek, bir UI elemanının (Image, Panel vb.) `RectTransform`'ını fare ile sürüklemeyi sağlar. `IPointerDownHandler` ve `IDragHandler` arayüzleri, UI olaylarını dinlemek için kullanılır.

İpucu 2: 2D Oyunlarda Fare Konumunu Dünya Koordinatlarına Çevirme

2D oyunlarda, farenin ekran koordinatlarını oyun dünyası koordinatlarına (world coordinates) çevirmek için `Camera.ScreenToWorldPoint()` metodunu kullanırız. Bu, fareyle bir nesne seçmek veya sahneye bir şeyler yerleştirmek için idealdir:

using UnityEngine;

public class Fare2DKonumOrnegi : MonoBehaviour
{
    [SerializeField] private Camera _mainCamera;

    void Start()
    {
        if (_mainCamera == null)
            _mainCamera = Camera.main; // Ana kamerayı otomatik bul
    }

    void Update()
    {
        // Fare sol tuşuna basıldığında
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 fareEkranda = Input.mousePosition;
            // Z değeri önemlidir: 2D oyunlarda genellikle kameranın z konumuna eşit veya 0 verilir.
            // Eğer kameranız Orthographic ise, Z değeri objenin kameradan ne kadar uzakta olduğunu belirler.
            // Genellikle 0 veya bir sabiti kullanmak yeterlidir.
            fareEkranda.z = _mainCamera.nearClipPlane; // Veya bir sabit değer, örneğin 10f

            Vector3 fareDunyada = _mainCamera.ScreenToWorldPoint(fareEkranda);
            Debug.Log("2D Dünya Konumu: " + fareDunyada);
            // Bu konuma bir obje spawn edebilir veya hareket ettirebilirsiniz.
        }
    }
}

Burada önemli olan, `fareEkranda.z` değerini ayarlamaktır. 2D bir oyunda (Orthographic kamera), bu değer nesnenin kameradan ne kadar uzakta oluşacağını belirler. Genellikle 0 veya kameranın `nearClipPlane` değeri yeterlidir.

İpucu 3: 3D Oyunlarda Fare Konumunu Dünya Koordinatlarına Çevirme (Raycasting)

3D oyunlarda, fare imlecinin altında hangi 3D nesnenin olduğunu bulmak için ışın gönderme (raycasting) tekniğini kullanırız. `Camera.ScreenPointToRay()` metodu, fare konumundan sahneye bir ışın gönderir ve `Physics.Raycast()` bu ışının çarptığı nesneleri tespit eder:

using UnityEngine;

public class Fare3DKonumOrnegi : MonoBehaviour
{
    [SerializeField] private Camera _mainCamera;

    void Start()
    {
        if (_mainCamera == null)
            _mainCamera = Camera.main;
    }

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Ray ray = _mainCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100f)) // 100f, ışının maksimum mesafesi
            {
                Debug.Log("Tıklanan Nesne: " + hit.collider.name + ", Konum: " + hit.point);
                // hit.point, ışının çarptığı dünya koordinatındaki noktadır.
                // hit.collider, çarptığı nesnenin Collider bileşenidir.
            }
        }
    }
}

Bu yöntem, RTS (Gerçek Zamanlı Strateji) oyunlarında birim seçimi veya FPS (Birinci Şahıs Nişancı) oyunlarında hedef tespiti gibi senaryolar için vazgeçilmezdir. Bu, Unity fare konumu kullanımının en güçlü örneklerinden biridir.

İpucu 4: Fare İmlecini Gizleme ve Kilitleme

Özellikle birinci şahıs oyunlarında, fare imlecini gizlemek ve ekranın ortasına kilitlemek isteyebilirsiniz. Bu, oyuncunun kamerayı fareyle serbestçe döndürmesini sağlar:

using UnityEngine;

public class FareImleciKontrol : MonoBehaviour
{
    void Start()
    {
        // İmleci gizle
        Cursor.visible = false;
        // İmleci oyun penceresinin ortasına kilitle
        Cursor.lockState = CursorLockMode.Locked;
    }

    void Update()
    {
        // Esc tuşuna basıldığında imleci göster ve kilidi aç (menü gibi durumlar için)
        if (Input.GetKeyDown(KeyCode.Escape))
        {
            Cursor.visible = true;
            Cursor.lockState = CursorLockMode.None;
        }

        // Tekrar tıklandığında kilitle
        if (Input.GetMouseButtonDown(0) && Cursor.lockState == CursorLockMode.None)
        {
            Cursor.visible = false;
            Cursor.lockState = CursorLockMode.Locked;
        }
    }
}

Yaygın Hatalar ve Çözümleri

Unity fare konumu ile çalışırken karşılaşılan bazı yaygın hatalar ve bunların çözümleri:

Hata 1: Yanlış Koordinat Sistemi Anlayışı

Hata: `Input.mousePosition`'dan alınan değerleri doğrudan bir 3D objenin `transform.position`'ına atamak.

Çözüm: `Input.mousePosition` ekran koordinatlarını verirken, `transform.position` dünya koordinatlarını kullanır. Bu iki sistem birbirinden tamamen farklıdır. 2D veya 3D dünya koordinatlarına çevirmek için yukarıda bahsedilen `Camera.ScreenToWorldPoint()` veya `Camera.ScreenPointToRay()` metodlarını kullanmalısınız.

Hata 2: UI Elemanlarının Ölçeklendirilmesiyle Yaşanan Sorunlar

Hata: `Input.mousePosition` değerlerini doğrudan UI elemanlarının konumuna atamak veya `RectTransformUtility` kullanmamak.

Çözüm: Unity UI Canvas'ları farklı render modlarında (Screen Space - Overlay, Screen Space - Camera, World Space) ve farklı ölçeklendirme ayarlarına sahip olabilir. `RectTransformUtility.ScreenPointToLocalPointInRectangle` metodu, fare konumunu Canvas'ın yerel koordinat sistemine doğru bir şekilde çevirerek bu sorunları çözer.

Hata 3: Performans Sorunları (Gereksiz Hesaplamalar)

Hata: Her karede gereksiz yere yoğun hesaplamalar yapmak (örneğin, sürekli `Physics.Raycast` veya `new Vector3()` oluşturmak).

Çözüm: Raycasting gibi performansı etkileyebilecek işlemleri yalnızca ihtiyaç duyulduğunda yapın. Örneğin, sadece fare tıklandığında (`Input.GetMouseButtonDown(0)`) veya fare belirli bir mesafeden fazla hareket ettiğinde bu hesaplamaları tetikleyin. `Camera.main` gibi sık erişilen bileşenleri `Start()` metodunda önbelleğe alın.

Performans ve Optimizasyon Notları

  • Kamera Önbellekleme: `Camera.main` çağrısı Unity'nin tüm sahnede ana kamerayı aramasını gerektirir ve bu da performans maliyetine neden olabilir. `Start()` veya `Awake()` metodunda kamerayı bir değişkene atayarak bu maliyetten kaçınabilirsiniz:
    private Camera _mainCamera;
    void Awake() { _mainCamera = Camera.main; }
  • Gereksiz Raycast'lerden Kaçının: Özellikle 3D oyunlarda, her `Update()` döngüsünde `Physics.Raycast` yapmak performansı düşürebilir. Sadece fare tıklandığında veya belirli bir koşul karşılandığında raycast yapın.
  • Nesne Havuzu (Object Pooling): Eğer fare etkileşimi sonucunda sık sık yeni objeler oluşturuyorsanız, performansı artırmak için nesne havuzu kullanmayı düşünün.

Sonuç

`Input.mousePosition`, Unity'de fare etkileşimlerinin temelini oluşturan güçlü bir araçtır. Ekran koordinatlarını doğru bir şekilde anlayarak ve bunları oyununuzun ihtiyaçlarına göre dünya veya UI koordinatlarına dönüştürerek, oyuncularınıza zengin ve etkileşimli deneyimler sunabilirsiniz. Bu makalede ele aldığımız ipuçları ve yaygın hataların çözümleri, Unity fare konumu yönetimindeki becerilerinizi geliştirmenize yardımcı olacaktır. Fare kontrolünü ustaca kullanarak, oyunlarınızın oynanabilirliğini ve kullanıcı deneyimini önemli ölçüde artırabilirsiniz. İyi geliştirmeler!

🧠 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!