Unity’de Park Sensörü Yapımı (Gösterge & Ses)

Unity’de Park Sensörü Yapımı (Gösterge & Ses)

1 Aralık 2020 10 Yazar: Ahmet Güler

Merhaba, bir önceki dersimizde Unity ile yer çekimi silahı yani gravity gun yapmıştık.Böylece yapmış olduğunuz projelerde istediğiniz nesneler ile etkileşime girerek, çekme ve itme hareketlerini yapabiliyorduk.Bugünkü dersimizde ise Unity ile park sensörü yapacağız.Bunu yaparken raycast kullanacağız.Park sensörümüzü yaparken, ses ve gösterge panelimizi de yapacağız.Şimdi yeni bir proje oluşturalım ve dersimize başlayalım.

Sahnemizi oluşturmaya başlayalım.

Evet bu projemizde bulunan senaryomuza bir bakalım.Amacımız bir park sensörü yapmak olduğu için, sahnemizde bir aracımız olacak ve etrafta bulunan engellere yanaşarak araç üzerinde bulunan sensörlerimizin doğru çalışıp çalışmadığını kontrol edeceğiz.Şimdi sahnemize yeni bir Plane nesnesi ekliyoruz.Bu nesne bizim zeminimizi oluşturacaktır.Daha sonra Scene penceresindeki araçları kullanarak Plane nesnemizin boyutlarını arttırıyoruz.Bunu aracımızın üzerinde gideceği kadar bir alan oluşturmak için yapıyoruz.

Şimdi Hierarchy penceresinde sağ tıklayarak Create Empty seçimini yapıyoruz.Sonra Hierarchy penceresinde oluşturduğumuz boş nesnemizi seçiyoruz ve tekrar sağ tıklayarak yeni bir Cube nesnesi sahnemize ekliyoruz.Bu küp nesnesi park sensörlerini test edeceğimiz engelleri oluşturacaktır.Sahnemize eklediğimiz Cube nesnemizin boyutunu ve açısını değiştirerek kopyalıyoruz ve rastgele yerlere yerleştiriyoruz.Bu aşamaya kadar arabamızın üzerinde gideceği bir alanı ve park sensörlerini test edebileceğimiz engelleri oluşturduk.

Unity-Park-Sensörü-Yapımı-Gösterge-Ses-unity-how-to-make-a-parking-sensor

Aracımızı sahnemize ekleyelim.

Şimdi internette bulduğumuz bir 3D araba modelini Unity’de Project penceresine sürükleyerek bırakıyoruz.Daha sonra araba modelimizin prefab dosyasını sürükleyerek Scene penceresine yada Hierarchy penceresine bırakıyoruz.Bu araba nesnemiz için yeni bir etkiket oluşturuyoruz.Araba modelimiz üzerinde yapmamız gereken bir takım işlemler bulunuyor.Şimdi bunları yapmaya başlayalım.

İlk olarak araba modelimizin gövdesini ve tekerlerini Hierarchy penceresinde gruplandırıyoruz.Bunu yapmamızın amacı projenin ilerleyen aşamalarında hierarşik düzenin bozulmaması içindir.Şimdi araba modelimizin ebeveyn nesnesini seçiyoruz.Sonra Inspector penceresine gelerek, en altta bulunan “Add Component” butonuna basıyoruz ve Box Collider bileşenini ekliyoruz.

Box Collider bileşeninde bulunan “Edit Collider” butonuna basıyoruz ve Scene penceresine gelerek arabamızın gövde boyutuna göre tekrar hizalıyoruz.Burada dikkat etmemiz gereken nokta ise, arabamızın tekerlerinin bir kısmı bu sınırların içerisine girebilir fakat tamamı girmemelidir.Yani sadece araç gövdesi BoxCollider bileşeninden etkilenecektir.Tekerleri ise bir sonraki aşamada yapacağız.

Unity-Park-Sensörü-Yapımı-Gösterge-Ses-unity-how-to-make-a-parking-sensor

Yine Inspector penceresinde, en altta bulunan “Add Component” butonuna basıyoruz ve Rigidbody bileşenini ve Audio Source bileşenini ekliyoruz.Aracımız fizik unsurlarından etkileneceği için Rigidbody bileşenini eklememiz gerekiyor.Ridigbody bileşeninde bulunan “Mass” yani ağırlık değerini arttırmanızda yarar var.Çünkü düşük ağırlıklarda aracınızda titremeler meydana gelebilir.Audio Source bileşenini ise park sensörlerinden gelen sesi kontrol etmek için kullanacağız.

Tekerlere wheel collider bileşenini ekleyelim.

Şimdi aracımızda bulunan dört teker için ayrı ayrı etiketler oluşturuyoruz.Sonra aracımızda bulunan dört tekeri Hierachy penceresinde seçiyoruz ve Inspector penceresine gelerek, en altta bulunan “Add Component” butonuna basıyoruz.Daha sonra Wheel Collider bileşenini tekerlerimize ekliyoruz.Burada Wheel Collider bileşeni üzerinde bulunan özellikleri daha önceki bir yazımda detaylı olarak anlatmıştım.Bu nedenle eğer ilk defa kullanacaksanız o yazıya bakmanızı öneririm.

Unity-Park-Sensörü-Yapımı-Gösterge-Ses-unity-how-to-make-a-parking-sensor

Tekerlerimizin çapına uygun bir biçimde ayarladıktan sonra bazı yanlışlara değinmek istiyorum.Eğer tekere eklemiş olduğunuz Wheel Collider bileşeninin açısı yanlış ise, ebeveyn nesnenizde Rigidbody bileşeninin ekli olup olmadığını kontrol ediniz.Çünkü bu sorunun kaynağı bu bileşeni eklemeyi unutmaktır.Eğer projeyi başlattığınız zaman aracınız titriyorsa, “Mass” değerini arttırmayı deneyin.Eğer olmazsa, Wheel Collider üzerinde bulunan “Suspension Distance” değerinin sıfır “0” olup olmadığını kontrol edin.Çünkü sıfır ise, titreme yapacaktır.

Park gösterge panelini oluşturmaya başlayalım.

Şimdi park sensörümüzün gösterge panelini yapacağız.Bunun için öncelikle internetten bir arayüz bulmamız yada kendi arayüzümüzü oluşturmamız gerekiyor.Ben photoshop programı ile basit olarak kendi park gösterge arayüzümü oluşturdum.Bu aşamada kararı size bırakıyorum.İstediğiniz yolu seçebilirsiniz.Yalnız sıfırdan yapmak, gerek kodlama kısmında gerekse projenize uygunluğu açısından daha iyi olacaktır.

Sonra gösterge panelimizi “png” uzantısı ile kaydediyoruz ve Unity’de Project penceresine sürükleyerek bırakıyoruz.Burada eklemiş olduğunuz görselleri kullanmadan önce birkaç işlem yapmamız gerekiyor.Görsellerimizi seçiyoruz ve Inspector penceresinde bulunan Texture Type ayarını Sprite (2D and UI) olarak değiştiriyoruz.Bu şekilde birazdan Canvas içerisine ekleyeceğimiz Image nesnemizde bu görselleri kullanabileceğiz.

Unity-Park-Sensörü-Yapımı-Gösterge-Ses-unity-how-to-make-a-parking-sensor

Evet Hierarchy penceresine geliyoruz ve sağ tıklayarak sırasıyla UI > Canvas seçimini yapıyoruz.Daha sonra Canvas nesnemizi seçiyoruz ve Inspector penceresine geliyoruz.Burada yer alan Canvas Scaler bileşeninde birkaç düzenleme yapmamız gerekiyor.Öncelikle UI Scale Mode ayarını Scale With Screen Size olarak değiştiriyoruz.Daha sonra aşağıya açılan Reference Resolution bölümüne istediğiniz bir çözünürlük değerini yazıyoruz.Tavsiyem Full HD yani 1920×1080 bir değer girmenizdir.

Eklemiş olduğumuz Canvas nesnemize sağ tıklıyoruz ve UI > Image yolunu izliyoruz.Sonra Image nesnemizi Scene penceresinde bulunan araçlar yardımı ile konumunu ve boyutunu ayarlıyoruz.Daha kolay olması açısından Anchors yani çapaları da kullanabilirsiniz.Nasıl kullanılacağını önceki yazılarımda bulabilirsiniz.Şimdi Image nesnemizi seçiyoruz ve Inspector penceresine geliyoruz.

Burada Image bileşeni altında yer alan Source Image bölümünü Project penceresinde bulunan araba görselini sürükleyerek bırakıyoruz.Daha sonra Image Type ayarını Simple olarak değiştiriyoruz.Son olarak Preserve Aspect ayarını aktif ediyoruz.Şimdi park göstege panelimizi oluşturmaya devam edebiliriz.

Unity-Park-Sensörü-Yapımı-Gösterge-Ses-unity-how-to-make-a-parking-sensor

Arabamızın görselini ekledik.Şimdi park sensörlerinin görsellerini ekleyelim.Bunun için Hierarchy penceresinde bulunan Image nesnemize sağ tıklıyoruz ve Create Empty seçimini yapıyoruz.Sonra Hierarchy penceresinde oluşturduğumuz boş nesnemizi seçiyoruz ve tekrar sağ tıklayarak yeni bir Create Empty daha oluşturuyoruz.Şimdi neden iki tane boş nesne oluşturduk derseniz, bunlar park sensörlerinin düzenini sağlamak için eklendi.

Yani hiyerarşik olarak ilk boş nesne, önde bulunan tüm sensörleri içerisinde barındırıyor.İkinci boş nesne ise sensör grubunun konumu (orta-sağ-sol) içerisinde barındırıyor.İkinci oluşturduğumuz boş nesnemize yeni bir etiket oluşturuyoruz.Eğer burada kafanız karışıysa, aşağıdaki görselden daha iyi anlayacağınızı umuyorum.Şimdi ikinci boş nesnemize sağ tıklıyoruz ve UI > Image yolunu izliyoruz.Eklediğimiz bu Image nesnemizden üç tane kopya daha alıyoruz.

Çünkü park sensörlerimizin üç tane kademesi bulunuyor.Yada sizin kullandığınız park göstergesinde kaç tane kademe varsa, o kadar kopyalayabilirsiniz.Daha sonra tek tek Image nesnelerimizi seçiyoruz ve Inspector penceresinde Image bileşeni altında yer alan Source Image bölümünü Project penceresinde bulunan park sensörü görsellerini sürükleyerek bırakıyoruz.Daha sonra Image Type ayarını Simple olarak değiştiriyoruz.Son olarak Preserve Aspect ayarını aktif ediyoruz.

Unity-Park-Sensörü-Yapımı-Gösterge-Ses-unity-how-to-make-a-parking-sensor

Kodlarımızı yazmaya başlayalım.

Şimdi buraya kadar sahnemizi hazırladık.Şimdi ise kodlama bölümüne geçiyoruz.Yalnız burada belirtmem gerek bir husus bulunuyor.Bu projede aracımızın hareketi için ayrı bir script dosyası bulunuyor.Bunu daha önceki bir yazımda paylaştığım için ve bu yazımızın konusunu araç hareketi olmadığı için tekrar paylaşmayacağım.Çünkü bu gereksiz bir uzunluğa neden olur ve ana konumuzdan sapmış oluruz.O yüzden yeni bir C# Script dosyası oluşturuyoruz ve editör yardımı ile açarak kodlarımızı yazmaya başlıyoruz.

using UnityEngine.UI;

ilk olarak script dosyamızda arayüz (UI) elemanlarını da kullanacağımız için bu kütüphaneyi projemize dahil ediyoruz.

[Header("Genel Ayarlar:")]
public float IsinUzunlugu;
public float Kademe1Uzakligi, Kademe2Uzakligi, Kademe3Uzakligi;
public AudioClip[] SensorSesi;
public AudioSource ParkSensoruSesi;
private Image OnOrtaDerece1, OnOrtaDerece2, OnOrtaDerece3;
private Image OnSagDerece1, OnSagDerece2, OnSagDerece3;
private Image OnSolDerece1, OnSolDerece2, OnSolDerece3;
private Image ArkaOrtaDerece1, ArkaOrtaDerece2, ArkaOrtaDerece3;
private Image ArkaSagDerece1, ArkaSagDerece2, ArkaSagDerece3;
private Image ArkaSolDerece1, ArkaSolDerece2, ArkaSolDerece3;

Daha sonra script dosyamızda kullanacağımız değişkenleri oluşturuyoruz.İlk satırda bir başlık oluşturuyoruz.İkinci satırda bir float değişkeni oluşturuyoruz.Bu değişken ile ışınlarımızın uzunluğunu kontrol edebileceğiz.Üçüncü satırda yine float değişkenleri oluşturuyoruz.Bu üç değişkeni ise, park sensörlerinin mesafe ayarını yapmak için kullanacağız.Dördüncü satırda Audio Clip dizisi oluşturuyoruz.Bu dizide park sensörlerinin farklı kademelerinde çıkacak sesleri kontrol edeceğiz.

Beşinci satırda Audio Source değişenimizi oluşturuyoruz.Bu değikende ise Audio Source bileşenimizi kontrol edeceğiz.Altıncı ve onbirinci satırlar arasında birçok Image değişkeni oluşturuyoruz.Bu değişkenler park sensörlerimizin gösterge panelinde kullanacağımız görselleri kontrol edecekler.Bu sensörleri kendi aralarında gruplara ayırarak daha düzgün bir görüntü elde edebiliriz.

[Header("Ön Tampon Orta Nokta Ayarları:")]
public Vector3 OnTamponOrtaNoktaHizasi;
private Vector3 OnTamponOrtaNoktaIsinYonu;
private RaycastHit OnTamponOrtaNokta;
[Range(-90f, 90f)]
public float OnTamponOrtaNoktaAcisi;
public Color OnTamponOrtaNoktaIsinRengi;

Evet şimdi değişkenlerimiz oluşturmaya devam ediyoruz.Bu kısımda park sensörlerimizin konumlarını ayarlamak için ayrı ayrı değişkenler oluşturacağız.Ben aynı kod bloklarını tekrar tekrar yazmamak için sadece bir tanesini anlatacağım.Diğerleri yine aynı şekilde olacak ve sadece değişken isimleri farklılık gösterecek.Şimdi ilk satırda yine bir başlığımız var.Bu başlıklar önemli zira, kod satırlarınız uzadıkça hem karışıklığın önüne geçiyor hemde Inspector penceresinde düzenli bir görüntü oluşturuyor.

İkinci satırda Vector3 değişkeni oluşturuyoruz.Bu değişken ile raycast ışınlarımızın araç üzerindeki hizasını ayarlayabileceğiz.Üçüncü satırda yine Vector3 değişkeni oluşturuyoruz.Bu değişkenimiz ile  raycast ışınlarımızın yönünü belirleyeceğiz.Yalnız bu değişkene doğrudan erişmeyeceğimiz için başına private yazıyoruz.Böylece Inspector penceresinde görünürlüğünü gizlemiş oluyoruz.

Dördüncü satırda RaycastHit oluşturuyoruz.Normalde bunu Local olarak oluşturmamız gerekiyor.Fakat biz Raycast ışınlarımızı bir fonksiyon yazarak kontrol edeceğimiz için Global olarak oluşturmamız gerekiyor.Yazının ilerleyen bölümlerinde daha iyi anlayacağınızı umuyorum.Beşinci satırda Range kodunu görüyorsunuz.Range aynı Header gibi bir decorator.Yani Inspector penceresinde bazı olayları gerçekleştirmemize olanak sağlıyor.

İşlevine gelecek olursak, burada -90 ile 90 arasında bir değer seçmemizi sağlıyor.Farkı ise, bu değerleri bir slider üzerinde sağa sola çekerek belirleyebiliyoruz. Etki edeceği alan ise bir alt satırı oluyor.Altıncı satırda bir float değişkeni oluşturuyoruz.Bu değişkenle ışınlarımızın açısını değiştirebileceğiz.Son satırda ise bir Color değişkeni oluşturuyoruz.Bu değişken ile Scene penceresinde ışınlarımızın rengini değiştirebileceğiz.

Unity-Park-Sensörü-Yapımı-Gösterge-Ses-unity-how-to-make-a-parking-sensor

ParkSensoruSesi = GetComponent<AudioSource> ();
OnOrtaDerece1 = GameObject.FindWithTag("on_orta_sensorler").transform.GetChild(0).GetComponent<Image> ();
OnOrtaDerece2 = GameObject.FindWithTag("on_orta_sensorler").transform.GetChild(1).GetComponent<Image> ();
OnOrtaDerece3 = GameObject.FindWithTag("on_orta_sensorler").transform.GetChild(2).GetComponent<Image> ();

Evet şimdi bu kodları start() fonksiyonumuzun içerisine yazıyoruz.Yine Image değişkenlerimizin tamamını yazmadım.Çünkü aynı kodları kopyala/yapıştır yapacağız ve sadece etiket isimleri değişiklik gösterecektir.Şimdi ilk satırda “ParkSensoruSesi” değişkenimize, script dosyamızın ekli olduğu nesnenin Audio Source bileşenini tanımlıyoruz.

İkinci satırda “OnOrtaDerece1” değişkenimizin değerine, etiketi “on_orta_sensorler” olan nesnemizin birinci alt nesnesinin (child object) Image bileşenini tanımlıyoruz.Hierarchy penceresinde bakacak olursak, orada üç tane alt nesnenin olduğunu göreceğiz.Birinci nesneyi almak için neden bir “1” yerine sıfır “0” yazdık derseniz,  dizinin başlangıç elemanını çekmek için diyebiliriz.Çünkü programcılıkta sıfırdan başlama kuralı vardır.

Yine üçüncü ve dördüncü satırlarda da değişkenlerimize etiketi “on_orta_sensorler” olan nesnemizin ikinci ve üçüncü alt nesnelerinin (child object) Image bileşenlerini tanımlıyoruz.Böylece ön taraftaki park sensörlerimizin ilk bölümün kontrolünü sağlamış olduk.Aynı kod bloğunu kopyala/yapıştır yaparak, diğer etiketleri içinde değişken tanımlamalarını yapıyoruz.Böylece tüm park sensörlerimizin kontrolünü sağlamış oluyoruz.

Park sensörümüzün sesi için fonksiyonumuzu oluşturalım.

void SensorSesiKontrolu (AudioClip Ses, float SesSeviyesi) {
   if (!ParkSensoruSesi.isPlaying) {
      ParkSensoruSesi.clip = Ses;
      ParkSensoruSesi.volume = SesSeviyesi;
      ParkSensoruSesi.Play();
   }
}

Evet şimdi yeni bir fonksiyon oluşturuyoruz.Bu fonksiyon ile park sensörlerimizden çıkacak olan sesi kontrol edeceğiz.İlk satırda fonksiyomuzu oluştururken parametreli oluşturuyoruz.Parantez içerisine bakacak olursak ilk parametremiz bir AudioClip ve ikinci parametremiz ise, bir float değişkeni oluyor.Bunları park sensörlerinden çıkacak sesi ve sesin seviyesini değiştirmek için kullanacağız.

İkinci satırada yeni bir koşul oluşturuyoruz.Eğer sahnemizde herhangi bir ses çalmıyor ise koşulumuz aktif oluyor.Bu denetimi “isPlaying” kodu ile sağlıyoruz.Koşulumuzun başındaki ünlem “!” işareti ise olumsuzluk katmak için kullanılıyor.Üçüncü satırda “ParkSensoruSesi” değişkenimize tanımlı Audio Source bileşeninin “clip” özelliğine erişip, “Ses” değişkenimizde tanımlı sesi buraya eşitliyoruz.

Dördüncü satırda yine “ParkSensoruSesi” değişkenimize tanımlı Audio Source bileşeninin bu sefer “volume” özelliğine erişip, “SesSeviyesi” değişkenimizin aldığı değeri buraya eşitliyoruz.Beşinci satırda ise “ParkSensoruSesi” değişkenimize tanımlı Audio Source bileşenine erişip, tanımlı ses dosyasını çalışıyoruz.Bunu yapmak içinde “Play()” fonksiyonundan yararlanıyoruz.

Park sensörümüzün göstegesi için fonksiyonumuzu oluşturalım.

void SensorIkonuKontrolu (Image SensorIkonu1, Color SensorRengi1, Image SensorIkonu2, Color SensorRengi2, Image SensorIkonu3, Color SensorRengi3) {
   SensorIkonu1.color = SensorRengi1;
   SensorIkonu2.color = SensorRengi2;
   SensorIkonu3.color = SensorRengi3;
}

Evet şimdi yeni bir fonksiyon daha oluşturuyoruz.Bu fonksiyon ile park sensörlerimizin göstege panelinde yer alan ikonları konrol edeceğiz.İlk satırda fonksiyomuzu oluştururken yine parametreli oluşturuyoruz.Çünkü ilk oluşturduğumuz fonksiyonda olduğu gibi bu fonksiyona da dışarıdan erişip kontrol edeceğiz.Bu fonksiyonda oluşturduğumuz pararametrelere bakalım.

Karışık gibi görünebilir fakat öyle değil.Bakacak olursak, üç tane Image değişkeni ve üç tane Color değişkeni olduğunu görüyoruz.Bunlar sensör ikonlarının üç kademesini ayrı ayrı kontrol ediyor.Bu yüzden her birinden üç tane bulunuyor.Image değişkenleri ikonlara erişimi sağlarken, Color değişkenleri ikonlarının renklerini kontrol ediyor.

İkinci satıra bakacak olursak “SensorIkonu1” değişkenimize tanımlı Image bileşenimize erişip “color” değerini, “SensorRengi1” değişkenimize tanımlı renk ile değiştiriyoruz.Üçüncü ve dördüncü satırlarda da bu işlemleri diğer park sensörü ikonları için tekrar ediyoruz.

Park sensörümüzün kontrolü için fonksiyonumuzu oluşturalım.

Evet park sensörümüzün sesini ve gösterge paneli için fonksiyonlarımızı oluşturduk.Şimdi park sensörümüzün ana kontrolü için fonksiyonumuzu oluşturacağız.Bunu bir fonksiyon şeklinde yapmamızın nedeni, daha az satırda kod yazmak ve aynı kod bloklarını tekrar tekrar yazmamak içindir.Böylece taha temiz bir proje ortaya çıkarmış oluyoruz.Eğer her Raycast için tekrar tekrar kod bloğu oluşturmak isterseniz bana iletin, yazıyı güncellerim.

void ParkSensoru(RaycastHit Isin, Vector3 IsinYonu, Vector3 IsinHizasi, float IsinAcisi, Color IsinRengi, Image Sensor1, Image Sensor2, Image Sensor3, bool IsinEkseni) {
   if (IsinEkseni) {
      IsinYonu = Quaternion.AngleAxis(IsinAcisi, transform.up) * transform.forward;
   }else {
      IsinYonu = Quaternion.AngleAxis(IsinAcisi, transform.up) * -transform.forward;
   }
   Vector3 IsinPozisyonu = transform.TransformDirection(IsinHizasi * IsinUzunlugu);
   Debug.DrawRay(transform.position + IsinPozisyonu, IsinYonu, IsinRengi);
   ----
}

Şimdi üçüncü fonksiyonumuzu oluştutuyoruz.Yine diğerlerinde olduğu gibi parametreler kullanıyoruz.Ancak bu fonksiyonumuzdaki parametre sayısı diğerlerinden biraz fazla bulunuyor.Çünkü birden fazla değişkenimiz var ve bunların hepsini tam bir şekilde kontrol etmemiz gerekiyor.RaycastHit değişkenimiz ile hangi ışını kontrol edeceğimizi seçiyoruz.Vector3 değişkenimiz ile seçtiğimiz ışınımızın yönünü belirliyoruz.

Yine ikinci bir Vector3 değişkenimiz ile seçtiğimiz ışının hizasını ayarlıyoruz.Float değişkenimiz ile seçtiğimiz ışının açısı ayarlıyoruz.Color değişkenimiz ile seçtiğimiz ışının rengini ayarlıyoruz.Üç tane Image değişkenimiz ile park sensörlerimizin her bir kademedeki ikonunu kontrol ediyoruz.Son olarak bool değişkenimiz ile, seçtiğimiz ışının yönünün düz mü yoksa ters mi olacağını ayarlıyoruz.

İkinci satıra bakacak olursak, yeni bir koşul oluşturuyoruz.Eğer “IsinEkseni” değişkenimizin değeri true ise ilgili bölümü aktif ediyoruz.Tam tersi ise yani false ise else bölümünü aktif ediyoruz.Üçüncü satırda koşulumuzun true olması durumunda, “IsinYonu” değişkenimizin değerini AngleAxis fonksiyonumuzda yer alan açı ve yön ile değiştiriyoruz.Tabi bunu belirlerken “transform.forward” kodu ile çarparak ışın eksenini belirliyoruz.

Dördüncü satırda koşulumuzun false olması durumunda ise, “IsinYonu” değişkenimizin değerini yine AngleAxis fonksiyonumuzda yer alan açı ve yön ile değiştiriyoruz.Bu sefer eksenin tam tersi olması için “-transform.forward” kodu ile çarparak ışın eksenini belirliyoruz.Böylece aksi istikamette uzanan bir ışınımız oluyor.Altıncı satırda yeni bir Vector3 değişkeni oluşturuyoruz.Bu değişkene TransformDirection fonksiyonu ile değerini eşitliyoruz.

TransformDirection fonksiyonu ile eksenleri yerelden genele dönüştürmüş oluyoruz.Parantez içerisinde ise “IsinHizasi” değişkenimizde yer alan değerler ile “IsinUzunlugu” değişkenimizin değerini çarpıyoruz.Böylece istediğimiz noktada ve istediğimiz uzunlukta bir ışınımız oluyor.Yedinci satırda DrawRay fonksiyonunu kullanıyoruz.

Bu fonksiyon ile Scene penceresinde Raycast ışınlarımızın konumlarını ve açılarını görebiliyoruz.Yalnız ışınlarınızın konumlarını doğru görüntüleyebilmek için parantez içerisinde olduğu gibi, “transform.position + IsinPozisyonu” nesnenizin başlangıç değerleri ile yeni konum değerlerini toplamanız gerekiyor.Buraya dikkat etmeniz önemlidir.

if (Physics.Raycast (transform.position + IsinPozisyonu, IsinYonu, out Isin)) {
   if (Isin.distance >= Kademe2Uzakligi && Isin.distance <= Kademe3Uzakligi) {
      SensorIkonuKontrolu (Sensor1, Color.black, Sensor2, Color.black, Sensor3, Color.green);
      SensorSesiKontrolu (SensorSesi[0], 0.5f);
   }
   else if (Isin.distance >= Kademe1Uzakligi  && Isin.distance <= Kademe2Uzakligi) {
      SensorIkonuKontrolu (Sensor1, Color.black, Sensor2, Color.yellow, Sensor3, Color.green);
      SensorSesiKontrolu (SensorSesi[1], 0.8f);
   }
   else if (Isin.distance <= Kademe1Uzakligi) {
      SensorIkonuKontrolu (Sensor1, Color.red, Sensor2, Color.yellow, Sensor3, Color.green);
      SensorSesiKontrolu (SensorSesi[2], 1);
   }else {
      SensorIkonuKontrolu (Sensor1, Color.black, Sensor2, Color.black, Sensor3, Color.black);
      SensorSesiKontrolu (null, 0);
   }
}

Evet fonksiyonumuzun devamına bu kodları yazıyoruz.İlk satırda yeni bir koşul oluşturuyoruz.Eğer raycast ışınlarımız bir nesne ile temas ederse koşulumuz aktif oluyor.Parentez içerisine dikkat ederseniz, ışınların başlangıç noktasını ve yönünü az önce dediğim gibi belirtiyoruz.Aksi taktirde yanlış bilgiler verecektir.Tabi bizim projemizde sadece bu yeterli olmayacaktır.O yüzden ikinci satırda yeni bir koşul daha oluşturuyoruz.

Eğer ışınımız ile temas ettiği nesne arasındaki uzaklık “Kademe2Uzakligi” değişkenindeki değer ile “Kademe3Uzakligi” değişkenindeki değer arasında ise koşulumuz aktif oluyor.Bu değerleri kendinize göre Inspector penceresinden ayarlayabilirsiniz.Üçüncü satırda “SensorIkonuKontrolu()” fonksiyonumuzu çağırıyoruz.Parantez içerisine ilgili parametreleri giriyoruz.

Sırasıyla park sensörümüzün birinci kademe ikonu ardından bu ikonun rengini belirliyoruz.Sonra ikinci kademe ikonu ve rengi, son olarak da üçüncü kademe ikonu ve rengini belirliyoruz.Dördüncü satırda ise “SensorSesiKontrolu()” fonksiyonumuzu çağırıyoruz.Parentez içerisinde ilk parametre olarak “SensorSesi” dizisinde bulunan seçtiğimiz sesi, ikinci parametre olarak da bu sesin seviyesini belirtiyoruz.

Şimdi bizim park sensörümüzün üç kademe aldığını söylemiştim.Şu an ilk kademe için işlemlerimizi yaptık.İkinci ve üçüncü kademeler içinde else if koşullarımızı kullanıyoruz.Kısaca belirlediğimiz mesafelerde ilgili koşulumuzun içersine giriyoruz ve orada bulunan komutları uyguluyoruz.Altı ile onaltıncı satırlar arasında da bu işlemleri gerçekleştirmiş oluyoruz.Son else kısmında ise, sensörlerimizin hiçbir nesneye ilgili mesafelerde temas etmediği durumlarda ne olacağını belirtiyoruz.

Evet “SensorIkonuKontrolu()” fonksiyonumuzun farklı mesafelerde renginin değişmesi gerekiyor.Örnek olarak 10 metrede sadece üçüncü kademe ikonunun renginin değişmesi gerekiyor.5 metrede ikinci kademe ikonun da renginin değişmesi gerekiyor.1 metrede ise son yani üçüncü kademe ikonunda renginin değişmesi gerekiyor.Böylece üç kademe rengi de değişmiş oluyor.Yukarıda ki kod bloğunda buna dikkat etmenizi istiyorum.

ParkSensoru(OnTamponOrtaNokta, OnTamponOrtaNoktaIsinYonu, OnTamponOrtaNoktaHizasi, OnTamponOrtaNoktaAcisi, 
       OnTamponOrtaNoktaIsinRengi, OnOrtaDerece1, OnOrtaDerece2, OnOrtaDerece3, true);
ParkSensoru(ArkaTamponOrtaNokta, ArkaTamponOrtaNoktaIsinYonu, ArkaTamponOrtaNoktaHizasi, ArkaTamponOrtaNoktaAcisi, 
            ArkaTamponOrtaNoktaIsinRengi, ArkaOrtaDerece1, ArkaOrtaDerece2, ArkaOrtaDerece3, false);

Evet artık kodlama kısmının sonuna geliyoruz.Bize gerekecek fonksiyonlarımızı oluşturduk.Şimdi son fonksiyonumuz olan “ParkSensoru()” fonksiyonumuzu nasıl kullanacağımıza bir bakalım.Bugün yazdığımız fonksiyonlar arasında en çok parametreyi bu fonksiyonda kullandığımız için biraz karışık görünebilir fakat mantığını oturtuğumuz zaman işimiz çok kolaylaşacaktır.Update() fonksiyonumuzun içerisine bu kodları yazıyoruz.Yalnız bizim toplam 6 tane sensörümüz bulunuyor.Ben burada, bir tane ön sensörden ve bir tane arka sensörden örnek oluşturdum.

Şimdi ilk satırdaki parametrelere sıradan bir inceleyelim.”OnTamponOrtaNokta” ilgili raycast ışımız, “OnTamponOrtaNoktaIsinYonu” ilgili ışınımızın yönü, “OnTamponOrtaNoktaHizasi” ilgili ışınımızın konumu, “OnTamponOrtaNoktaAcisi” ilgili ışınımızın açısı, “OnTamponOrtaNoktaIsinRengi” ilgili ışınımızın rengi, “OnOrtaDerece1 – OnOrtaDerece2 – OnOrtaDerece3” ilgili ışınımızın birinci, ikinci ve üçüncü kademedeki ikonları ve son olarak da ilgili ışınımızın eksenini belirleyen bool değeri geliyor.

İkinci satırımızdaki fonksiyonda ise yine ilgili sensörümüzün değişkenlerinin isimleri ve en önemlisi sondaki bool değeri geliyor.Dikkat ederseniz, ikinci fonksiyonumuz aracımızın arka park sensörlerinden birini kontrol ediyor.Ve bu nedenle de başlagıç ekseninin ters olması gerekiyor.Son olarak C# Script dosyamızı Hierarchy penceresinde araba modelimizin ebeveyn nesnesinin üzerine sürekleyerek bırakıyoruz.Park sensörü seslerini script dosyamızda ilgili bölümlere ekliyoruz.Artık projemizi test edebiliriz.Evet bir sonraki yazıda görüşmek üzere…

Unity-Park-Sensörü-Yapımı-Gösterge-Ses-unity-how-to-make-a-parking-sensor