Bu bölümde; mobil cihazlarda iki parmakla yakınlaştırma/uzaklaştırma gibi standart dokunmatik kontrollerin üzerinden geçeceğiz.
Bu dokunmatik kontroller ana kameraya bir script(kod) eklenerek yapılacaktır.
Sahnedeki ana kamerayı seçiniz.
Ardından,
"Add Component/New Script" butonlarına basarak kameraya yeni bir C# kodu ekliyoruz.
Script'in adını "PinchZoom" koyuyoruz.
Bu işlem bittikten sonra,
"Create and Add" butonuna tıklayınız.
Şimdi,
Script'e çift tıklayarak düzenlemek için açabiliriz.
Hadi sınıfın gövdesini temizleyerek kendimize temiz bir yer açalım :)
İki parmakla yakınlaştırmanın prensibi şöyledir..
(Mobil cihazlarda)
Öncelikle: iki parmağın da KESİN OLARAK mobil cihazla
temas halinde olduğundan emin olmalıyız.
Ardından, ekrana temas halindeki iki parmağın
dokunma anındaki karede ve bir önceki karede aralarındaki mesafeyi bilmeliyiz.
Eğer ekrana dokunan parmaklar arasındaki mesafe küçüldüyse parmaklar birbirine yaklaşmıştır.
Bu durumda UZAKLAŞTIRMA yapmalıyız.
Benzer şekilde, parmaklar arasındaki mesafe arttıysa YAKINLAŞTIRMA yapmalıyız.
Burada yapmamız gereken ilk şey..
Birkaç public float değişken yazmaktır.
(public = heryerden erişime açık)
(float = küsüratlı sayı)
Bu değişkenler yakınlaştırma/uzaklaştırma esnasındaki hızı ayarlamamızı sağlayacak.
İki değişkene ihtiyacımız var..
..bu şekilde hem Perspective hem Orthographic kameraların hızlarını birbirinden bağımsız olarak ayarlayabiliriz.
Bu değişkenleri sırasıyla;
perspectiveZoomSpeed ve orthoZoomSpeed olarak adlandıralım.
Aynı zamanda varsayılan değerleri 0,5 olarak verelim.
Cihazdaki dokunma girdileri Update döngüsünde zamanla tespit edildiğinden
Genellikle en iyisi,
bu girdilerle Update fonksiyonunda uğraşmaktır.
Ancak, cihaza kesin olarak iki parmak dokunuyorsa birşey yapmak istiyoruz.
Bunu "Input.touchCount" özelliğini kullanarak kontrol edebiliriz.
Artık cihaza, kesin olarak iki parmağın dokunduğundan emin olduğumuzdan..
..bu dokunmaları kendi değişkenlerimizde depolayabiliriz.
Bu şekilde Input sınıfındaki özelliklere sürekli erişmek zorunda kalmayız.
Bu dokunma girdilerine Input sınıfındaki GetTouch() fonksiyonuyla ulaşacağız.
Sadece iki dokunma girdisi olduğundan,
Bu girdiler dokunma girdileri dizisindeki 0. ve 1. elemanlar olmalıdır.
Bu dokunmaların birer kopyalarını almak için GetTouch() fonksiyonuna 0 ve 1 değerlerini verebiliriz.
Şimdi dokunma bilgileri elimizde olduğuna göre..
..bir önceki karede hangi pozisyonlarda olduklarını bilmeliyiz.
Bunu,
şu anki pozisyonlarından delta pozisyonlarını çıkararak buluruz.
Her bir karede parmaklar arasındaki mesafeyi bulup..
..bu bilgiyi kullanarak yakınlaştırma mı uzaklaştırma mı olacağını kestiririz.
Her iki karede de parmaklar arasındaki mesafeyi bulabilmek için..
Bir parmağın pozisyonunu diğerininin pozisyonundan çıkararak bir vektör elde ederiz.
Ardından,
O vektörden, basitçe büyüklük değerini buluruz.
Bunu bir adımda, parantez içinde vektörleri birbirinden çıkarıp,
nokta(.) operatörünü kullanarak yaparız.
"Delta" terimini kullanıyoruz çünkü..
..bu terim iki veri parçacığı arasındaki değişimi ifade eder.
Her karede parmaklar arasındaki mesafeyi bulduğumuza göre..
Artık o mesafeler arasındaki farkları bulabiliriz.
Bu sefer çıkarma işlemindeki sıralama önemli.
Geçerli(şimdiki) karedeki parmaklar arasındaki mesafeden,
bir önceki karedeki mesafeleri çıkarırız.
Geçerli karedeki mesafe bir önceki karedeki mesafeden büyükse
negatif bir sonuç verir.
Bu da, parmaklar birbirinden uzaklaşıyor demektir.
Eğer parmaklar birbirinden uzaklaşıyorsa, yakınlaşma yapmamız gerekir.
FieldOfView (Perspektif kamera için) ,
OrtographicSize (Ortographic kamera için) azaltırız.
Bu koşullarda ya FieldOfView ya da OrtographicSize özelliklerini küçültmek istediğimiz için..
..iki değeri birbirinden çıkarmanın doğru yolu budur.
Kameranın özelliklerini değiştirmeden önce,
Kamera Orthographic Mod'da mı yoksa Perspective Mod'da mı bilmemiz gerekiyor.
Eğer Orthographic Mod'da ise kameranın orthographicSize değerini..
..mesafedeki değişim ile orthographic yakınlaşma hızını çarparak ayarlayabiliriz.
Aynı zamanda, kameramızın orthographicSize değerinin sıfırın altına düşmediğinden emin olmalıyız.
Eğer düşerse, görüntü ters döner.
(isterseniz deneyin :))
Bunu önlemek için..
Mathf sınıfından Max isimli fonksiyon arkadaşımızı kullanacağız.
Bu fonksiyon kendisine verilen en büyük parametreyi döndürür.
Kameranın orthograpicSize değerini ve 0,1 değerini vereceğiz.
Bu şekilde eğer kamera büyüklüğü 0,1 değerinin altına düşerse..
..tekrar 0,1 değerine çekebiliriz.
Şimdi, kamera ortografik modda değilse..
..perspektif modda olduğunu biliriz :)
bu durumda FieldOfView değerini değiştirmeliyiz.
FieldOfView değerini aynı miktarda ama perspectiveZoomSpeed kullanarak ayarlarız.
Tabi yine kameranın görüş alanını sınırlamak istiyoruz.
Ancak,
Görüş alanını bir açı değeri olduğundan,
0 ile 180 değerleri arasına çekmeliyiz.
Bunu Mathf sınıfından Clamp fonksiyonunu kullanarak yaparız.
Bu fonksiyon 3 değer alır.
Bir = sınırlamak istediğiniz değer,
iki = alabileceği en küçük değer,
üç = alabileceği en büyük değer.
Bizim sınırlandırmak istediğimiz değer,
kameranın görüş alanı
0,1 ile 179,9 değerleri arasında olmasını istiyoruz.
Kendi yakınlaştırma/uzaklaştırma sisteminizi yaparken,
kendinize uygun bir fieldOfView ve ortographicSize değeri seçebilirsiniz.
Bu kodda gösterilen limit değerlerini kullanıyoruz..
..çünkü uç koşullarda kabul edilebilir sonuçlar veriyor.
Bu kodumuzun sonuydu. Şimdi sıra test etmeye geldi :)
Bu noktada,
cihazınızın hazır olduğunu ve test için ayarlanmış olduğunu varsayıyoruz.
Cihazı nasıl ayarlayacağınızı bilmiyorsanız, cihazın dökümantasyonuna bakın.
(Google da "unity android/ios device configuration" diye aratın)
artık , File/Bulid Settings 'e tıklayarak projeyi build edebiliriz.
üzerinde çalıştığımız sahneyi build'e eklemeliyiz.
Eğer hala sahneyi kaydetmediyseniz şimdi kaydedin.
Ardından Build And Run butonuna tıklayın.
Gördüğünüz gibi parmaklarımızı birbirlerine doğru yaklaştırdığımızda..
..kamera uzaklaşıyor.
Parmaklarımız birbirlerinden uzaklaştığında, kamera yaklaşıyor.