Unity’de Işınlanma Sistemi Yapımı
Merhaba, bir önceki dersimizde Unity‘de basit bir oyuncu kontrolü yapmıştık.Bunun içerisinde hareket, zıplama ve kamera kontrol mekanikleri bulunuyordu.Bu dersimizde ise, Unity ile ışınlanma sistemi yapacağız.Böylece projelerimizde kontrol ettiğimiz nesnenin, başka koordinatlara hızlıca geçeceği bir teleport sistemi olacak.Şimdi yeni bir proje oluşturalım ve dersimize başlayalım.
Sahnemizin hazırlanması.
Bu senaryomuzda, iki adet ışınlanma kapımız olacak.Bunların birinden geçtiğimiz zaman, diğer noktanın pozisyonuna taşınacağız.Şimdi ilk olarak sahnemize bir Plane nesnesi ekleyelim.Bu zemin eğer ışınlanacak nesnemiz dışarıya doğru düşecek olursa, boşluğa gitmesin diye bir engel görevi görecek.Daha sonra iki adet Cylinder nesnesi oluşturuyoruz.Bu silindir nesneleri bizim ışınlanma kapılarımızı oluşturacak.Bunları altlı üstlü olacak şekilde sahnemize yerleştiriyoruz.
Tabi daha öncesinde bu nesneleri, Scene penceresinden istediğimiz boyutlarda ayarlamayı unutmuyoruz.Şimdi bu Cylinder nesnelerimizin collider bileşenlerini silmemiz gerekiyor.Çünkü bize düz bir collider gerekiyor.Bunun için Inspector penceresinden BoxCollider bileşenini her iki silindir nesnemize de ekliyoruz.Daha sonra bu nesneler için yeni etiketler oluşturuyoruz.Bu arada ben sahneme bu şekilde konumlandırmayı tercih ettim.Siz istediğiniz şekilde yerleştirebilirsiniz.Daha sonra bir Cube nesnesi oluşturuyoruz.Bu nesne, oyuncumuzun üzerinde hareket edeceği köprümüzü oluşturacak.
Sahnemin görseline bakacak olursanız, daha iyi anlayacaksınız.Bu nesnenin boyutları ile oynayarak istediğimiz şekle sokuyoruz.Sonra bir Cube nesnesi daha oluşturuyoruz.Bu nesne ise, bizim kontrol edeceğimiz ve portaldan geçecek olan oyuncumuzu oluşturacak.Bu nesneye Inspector penceresinde, Rigidbody bileşenini ekliyoruz.Sonra bu nesne için yeni bir etiket oluşturuyoruz ve sonra nesnemize ekliyoruz.Son olarak istediğimiz kaplamaları nesnelerimize ekledikten sonra sahnemiz hazır hale geliyor.Son hali bu şekildedir.
Script dosyalarımızı oluşturalım.
Bu proje için iki C# Script dosyası kullanacağız.Bir tanesi ışınlanma mekaniği için, diğeri oyuncu nesnemizin hareketi için kullanacağız.Şimdi ilk script dosyamızı editör ile açalım ve kod yazmaya başlayalım.
public Vector3 CikisNoktasi;
Öncelikle değişkenimizi oluşturuyoruz.Bu Vector3 değişkeninde, oyuncumuzun ikinci ışınlanma kapısından çıkması için gerekli koordinatları tutacağız.
CikisNoktasi = GameObject.FindWithTag ("cikis").transform.position; CikisNoktasi = new Vector3 (CikisNoktasi.x, CikisNoktasi.y-0.1f, CikisNoktasi.z);
Şimdi start() fonksiyonunun içerisine bu kodları yazalım.İlk satırda az önce tanımladığımız Vector3 değişkenimize, etiketi “cikis” olan nesnemizin pozisyonlarını eşitliyoruz.İkinci satırda ise, aldığımız pozisyon değerlerini biraz değiştiriyoruz.Şöyle ki, çıkış kapımızın üzerine ışınlanmamak için y ekseninin pozisyonunu eksi “0.1” azaltıyoruz.Böylelikle ışınlanma kapımızın tam altına geleceğiz.
void OnCollisionEnter(Collision Denetim) { if (Denetim.gameObject.tag == "oyuncu") { Denetim.transform.position = CikisNoktasi; } }
Sonra yeni bir OnCollisionEnter fonksiyonu oluşturuyoruz.Bu fonksiyon ile oyuncu nesnemizin ışınlanma kapısı ile temasını kontrol edeceğiz.İkinci satırda, yeni bir koşul oluşturuyoruz.Eğer ışınlanma kapısı ile temas eden nesnenin etiketi “oyuncu” ise, koşulumuz doğru oluyor ve içerisindeki kodları çalıştırıyor.
Üçüncü satıra bakacak olursak, bu kapı ile temas eden nesnemizin pozisyonunu, daha önce oluşturduğumuz değişkenin değerlerine eşitliyoruz.Böylelikle oyuncu nesnemizi diğer kapının pozisyonuna ışınlamış oluyoruz.Eğer ışınlanma kapısının içerisine girip ışınlanmak istiyorsanız, Trigger fonksiyonlarından birini kullanmanız gerekiyor.
transform.Rotate(0, 90f * Time.deltaTime * 0.1f, 0);
Bu kodu ise update() fonksiyonunun içerisine yazıyoruz.Bu kod ile, ışınlanma kapılarımızı y ekseninde sürekli olarak döndürmüş oluyoruz.Bu dönüşün hızını belirlemek içinde, “0.1” değeri ile çarpıyoruz.Bu değeri arttırarak, dönüş hızını değiştirebilirsiniz.Evet ilk script dosyamız hazır.
Işınlanacak nesnemize hareket kazandıralım.
Evet şimdi ikinci script dosyamızı açılım ve kodlarımızı yazmaya başlayalım.
public float OyuncuHizi;
İlk olarak değişkenimizi oluşturuyoruz.Bu değişken ile oyuncu nesnemizin hareket hızını belirleyebileceğiz.
OyuncuHizi = 5f;
Daha sonra start() fonksiyonumuzun içerisine bu kodu yazıyoruz.Az önceki değişkenimiz için bir değer belirliyoruz.
transform.Translate (Input.GetAxis("Vertical")*Vector3.forward*OyuncuHizi*Time.deltaTime); transform.Translate (Input.GetAxis("Horizontal")*Vector3.right*OyuncuHizi*Time.deltaTime);
Son olarak update() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda Translate fonksiyonunu kullanıyoruz.Burada Vector3.forward yani ileri yöndeki hareketini sağlamak için, hızı ayarladığımız değişkenimiz ile çarpıyoruz.Bu hareketin her karede aynı olması içinse, Time.deltaTime fonksiyonu ile çarpıyoruz.İkinci satırda da aynı görevleri yerine getiriyoruz.Ancak bu kez, yatay eksen için bu işlemleri yapıyoruz.Evet ikinci script dosyamızda hazır duruma geldi.
Evet artık script dosyalarımızı nesnelerimize ekleyebiliriz.İlk script dosyamızı, ışınlanma kapılarını oluşturan nesnelerimizin üzerine sürükleyip bırakıyoruz.Hareket için oluşturduğumuz ikinci script dosyamızı ise, oyuncu nesnemizin üzerine sürükleyip bırakıyoruz.Artık projemiz hazır.Evet bu projemizin de sonuna geldik.Bir sonraki yazıda görüşmek üzere…
merhaba hocam ben daha once yaptıgım bir oyunda fizik karakteri hareket ettirirken fizik sistemi yerine Translate kullanmıştım fakat Collider ı olan başka objelere captığında içlerinden geciyordu ya da cok az surukleyebiliyordu daha sonra obje onun içinden geçiyordu. boyle bir durum varken neden bu yolu tercih ediyorsunuz öğrenebilir miyim ?
Merhaba, bu mekaniği yada herhangi bir mekaniği birden fazla yol ile yapabilirsiniz.Bu sizin projenize, nelere ihtiyacınız olduğuna yada hangisini daha kolay bir biçimde gerçekleştirebileceğinize göre değişiklik gösterecektir.Ben bu yazıda böyle bir yol izlemiştim.Örneğin ben ışınlamayı gerçekleştirmek için, Collision yerine Trigger kullansaydım, bu sefer nesnenin içinden geçebilmem için isTrigger özelliğini aktif etmem gerekirdi.Ama yine aynı kapıya çıkardık.
merhabalar hocam benim bir sorum var benim projemde nesneler den bazıları oyun başlar başlamaz görünmez olan bazı nesnelerin pozisyonlarına ışınlanması gerekiyor . ben bu durumu nasıl çözebilirim. neden nesneleri direkt o pozisyona koymuyorsun derseniz ise sebebi bunun random olması mesela oyun bu sefer başladığında görünmez a nesnesine ışınlandıysa tekrar başlattığımda görünmez b nesnesine ışınlanması lazım.
Merhaba, öncelikle ışınlanma noktaları ve pozisyonları değişecek nesneler için bir liste yada dizi tanımlanması gerekiyor.Daha sonra bir döngü oluşturup, içerisinde Random.Range fonksiyonu ile listeden rastgele ışınlanma noktası seçilmelidir.Işınlanma noktasını seçtikten sonra, yine pozisyonları değişecek olan nesnelerin tutulduğu liste yada diziden sırasıyla nesneleri çekip, rastgele belirlediğimiz ışınlanma noktalarının pozisyonlarına ve gerekirse rotasyonlarına eşitlemek gerekiyor.Böylece projeyi her başlattığımız zaman, nesneler farklı ışınlanma noktalarında ortaya çıkacaktır.