
Unity’de Raycast Konumu ve Açısı Nasıl Değiştirilir?
Merhaba, bir önceki dersimizde Unity ile park sensörü yapmıştık.Böylece taşıt odaklı projelerinizi bu mekaniği kullanarak geliştirebilirsiniz.Bu dersimizde ise Unity‘de raycast konumu nasıl değiştirebileceğimizi öğreneceğiz.Hazır raycast pozisyonunu değiştirmişken, raycast açısını da değiştirmeyi göstereceğim.Şimdi vakit kaybetmeden yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizi oluşturmaya başlayalım.
Şimdi bu projede kullanacağımız bir senaryoda, sahnemizde iki nesnemiz olacak ve biz bu iki nesnenin kenarlarını ray yani ışınlarımız ile çerçeveleyeceğiz.Şimdi Hierarchy penceresinde sağ tıklayarak yeni bir Cube nesnesi oluşturalım.Oluşturmuş olduğumuz bu Cube nesnesini Scene penceresindeki araçları kullanarak yada Inspector penceresindeki Transform bölümünden bir dikdörtgen prizması biçimine getiriyoruz.
Bunu küp şeklinde de bırakabilirdik ancak, ışınlarımızın boyutlarını değiştirebilmek için dikdörtgen prizması kullanmak daha iyi olur diye düşündüm.Sonuçta burada işin mantığını kavramak daha önemlidir.Sahnemizdeki Cube nesnemizde, açı olmadan raycast ışınlarımızın konumunu ve yönünü değiştirmeyi göstereceğim.Böylece hangisi işinize yarıyorsa aralarındaki ayrımı ve kullanım şeklini görmüş olacaksınız.
Daha sonra yeni bir şekil daha ekliyoruz.Yalnız ben bu üçgen prizma şeklini, ışınlara açı vermeyi göstermek için sketchup programında oluşturdum.Siz başka bir şekil yada doğrudan projenizdeki nesne üzerinde de deneyebilirsiniz.Sahnemizdeki ikinci nesne olan üçgen prizma üzerinde ise, raycast ışınlarımıza açı vererek konumunu ve yönünü değiştirmeyi göstereceğim.
Şimdi Project penceresinde yeni bir C# Script dosyası oluşturuyoruz.Daha sonra oluşturduğumuz bu script dosyasını Hierarchy penceremizde bulunan iki nesnemizin üzerine sürükleyerek bırakıyoruz.Daha sonra script dosyamızı bir editör programı ile açarak kodlarımızı yazmaya başlıyoruz.
Raycast ışınlarının pozisyonunu değiştirmek.
Evet ilk olarak raycast konumunu nasıl değiştireceğimizi öğreneceğiz.Hemen kodlarımızı yazmaya başlayalım.
public float KenarUzunlugu; public Vector3 KenarHizasi; public Color KenarRengi;
İlk olarak değişkenlerimiz oluşturmakla başlıyoruz.İlk satırda float türünde bir değişken oluşturuyoruz.Bu değişken ile raycast ışınlarımızın boyutlarını değiştirebileceğiz.İkinci satırda, bir Vector3 yapısı oluşturuyoruz.Bu yapı ile raycast ışınlarımızın konumu değiştirebileceğiz.Üçüncü satırda ise bir Color değişkeni oluşturuyoruz.Bu değişkenle raycast ışınlarımızın rengini değiştirebileceğiz.Böylece ışınlarımızın konumu daha iyi ayırt edebileceğiz.
Debug.DrawRay(transform.position + KenarHizasi, transform.up * KenarUzunlugu, KenarRengi); RaycastHit Hit; if (Physics.Raycast(transform.position + KenarHizasi, transform.up * KenarUzunlugu, out Hit, KenarUzunlugu)) { if (Hit.transform.tag == "Nesne") { print("Algılandı!"); } }
Şimdi oluşturduğumuz değişkenleri kullanarak raycast üzerinde yerleşimine bir bakalım.İlk satırda Scene penceresinde ışınlarımızı görebilmek için, DrawRay fonksiyonumuzu kullanıyoruz.Parantez içerisinde ilk bölümde, script dosyamızın eklendiği nesnemizin pozisyonu ile “KenarHizasi” yapımızdaki değerleri topluyoruz.Böylece nesnemizin o anki konumu üzerinde bizim verdiğimiz konumu ekleyerek doğru pozisyonu çıkartıyoruz.Eğer nesnemizin pozisyonunu eklememiş olsaydık, yanlış konumlara ışın atmış olacaktık.
Parantez içerisindeki ikinci bölümde, ışınımızın yönü ile “KenarUzunlugu” değişkenimizde bulunan değeri çarpıyoruz.Böylece raycast ışınımızın uzunluğunu belirliyoruz.Burada yer alan ışınımızın yönü “transform.up” olarak geçiyor.Siz bu yönü kendinize göre değiştirebilirsiniz.Parantez içerisindeki son bölümde ise, ışınımızın rengi yani “KenarRengi” değişkenimizde bulunan renk bulunuyor.
İkinci satırda yeni bir RaycastHit oluşturuyoruz.Böylece nesnelerimiz ile diğer nesnelerin çarpışmaları bulabileceğiz.Üçüncü satırda yeni bir koşul oluşturuyoruz.Eğer raycast ışınlarımız bir nesne ile temas ederse koşulumuz aktif oluyor.Burada dikkat etmemiz gereken nokta parantez içidir.Çünkü ışınlarımızın konumunu ve çarpışma noktalarını doğru hesaplamamız gerekiyor.
Resimde görüldüğü gibi, nesnemizin başlangıç değerleri ile yeni konumu için verdiğimiz değerleri toplamamız gerekiyor.Daha sonra ışınımızın yönünü ve ışınımızın uzunluğunu çarpmamız gerekiyor.Böylece diğer nesneler ile çarpışmaları daha doğru hesaplayabiliriz.Dördüncü satırda bir koşul daha oluşturuyoruz.Eğer çarpıştığımız nesnenin etiketi “Nesne” ise koşulumuz doğru oluyor.Beşinci satırda ise print fonksiyonu ile Console penceresinde bir mesaj yazdırıyoruz.
Raycast ışınlarının açısını değiştirmek.
Evet şimdi raycast ışınlarımızın açısını değiştirmeyi öğrenelim.İşin mantığı yine aynı olacaktır.Sadece bir önceki bölümde yani, raycast pozisyonu değiştirirken kullandığımız kodlara birkaç ekleme yapacağız.
public float AciliKenarUzunlugu; public Vector3 AciliKenarHizasi; [Range(-180f, 180f)] public float KenarAcisi; public Color AciliKenarRengi;
Yine ilk olarak değişkenlerimiz oluşturmakla başlıyoruz.İlk satırsa float türünde bir değişken oluşturuyoruz.Bu değişken ile açı vereceğimiz kenar uzunluğunu ayarlayabileceğiz.İkinci satırda yeni bir Vector3 yapısı oluşturuyoruz.Bu yapıyla ise, açı vereceğimiz ışınımızın konumunu değiştireceğiz.Üçüncü 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, parantez içerisine verdiğimiz sayılar arasında değer seçmemizi sağlıyor.Farkı ise, bu değerleri bir slider üzerinde sağa sola çekerek belirleyebiliyoruz. Dördüncü satırda float türünde bir değişken daha oluşturuyoruz.Bir önceki satırdaki Range, bu değişkenimize etki edecektir.Son satırsa ise Color değişkeni oluşturuyoruz.Böylece ışınımızın rengini değiştirebileceğiz.
Vector3 AciliKenar = Quaternion.AngleAxis(KenarAcisi, transform.right) * transform.up; Debug.DrawRay(transform.position + AciliKenarHizasi, AciliKenar * AciliKenarUzunlugu, AciliKenarRengi); RaycastHit Hit; if (Physics.Raycast(transform.position + AciliKenarHizasi, AciliKenar * AciliKenarUzunlugu, out Hit, AciliKenarUzunlugu)) { if (Hit.transform.tag == "Nesne") { print("Algılandı!"); } }
İlk satırda yeni bir Vector3 yapısı oluşturuyoruz.Bu yapıda ise AngleAxis fonksiyonunu kullanıyoruz.Bu fonksiyon ile belirli değerlerde ve yönde açı uygulayabiliyoruz.Yine parantez içerisindeki “transform.right” benim seçtiğim yöndür.Siz bu yönü kendinize göre değiştirebilirsiniz.Ayrıca parentez dışında tekrar bir yön kullanarak açımızı çarpıyoruz.Bunu ise açı verdiğimiz raycast ışının uzanacağı yönü belirlemek için kullanıyoruz.Burada ben sağa ve sola açı alan ve aşağıdan yukarıya uzanan bir ışın oluşturdum.
İkinci satırda yine Scene penceresinde ışınlarımızı görebilmek için, DrawRay fonksiyonumuzu kullanıyoruz.Az önceki başlıkta yani raycast ışınlarının pozisyonunu değiştirirken, DrawRay fonksiyonu için aynı parantez içi anlatımı burada da geçerlidir.Yalnız burada birinci virgülden sonra direk yön ile uzunluğu çarpmak yerine, oluşturduğumuz Vector3 yapısı ile uzunluğu çarpıyoruz.Böylece ışınların açısını doğru görebiliyoruz.
Üçüncü satırda yeni bir RaycastHit oluşturuyoruz.Böylece az önceki gibi nesnelerimiz ile diğer nesnelerin çarpışmaları bulabileceğiz.Dördüncü satırda yeni bir koşul oluşturuyoruz.Eğer raycast ışınlarımız bir nesne ile temas ederse koşulumuz aktif oluyor.Yine burada dikkat etmemiz gereken nokta parantez içersidir.Çünkü ışınlarımızın konumunu ile çarpışma noktalarının konumu doğru hesaplamamız gerekiyor.
Yukarıdaki resimde görüldüğü gibi, nesnemizin başlangıç değerleri ile yeni konumu için verdiğimiz değerleri toplamamız gerekiyor.Daha sonra Vector3 yapımız ile ışınımızın uzunluğunu çarpmamız gerekiyor.Bu nokta çok önemlidir.Nasıl DrawRay fonksiyonu için Scene penceresinde doğru konumda raycast ışınlarımızı görmek önemli ise, bu ışınların çarpışmalarını doğru hesaplamakta bir o kadar önem arz ediyor.Beşinci satırda bir koşul daha oluşturuyoruz.Eğer çarpıştığımız nesnenin etiketi “Nesne” ise koşulumuz doğru oluyor.Altıncı satırda ise print fonksiyonu ile Console penceresinde bir mesaj yazdırıyoruz.
Evet şimdi projemizi başlatıyoruz ve yukarıdaki resimde görüldüğü gibi her bir kenar için deneme yanılma yolu ile istediğimiz yönde, açılarda ve uzunluklarda raycast ışınlarını oluşturuyoruz.Dediğim gibi keskin köşeli nesneler üzerinde denemeler yaparsanız hem mantığı daha kolay kavrarsınız hem de yumuşak kenarlı nesnelere geçiş yaptığınız zaman, hangi yönde ışın atmanız gerektiğini daha kolay bulabilirsiniz.Evet bu projemizin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…