Evet arkadaşlar bir projemde ihtiyacım oldu ve internette bu konu hakkında türkçe kaynak olmadığını farkettim. Hepimiz raycastı biliriz. Oyunun içinde istediğimiz doğrultuda ve uzunlukta görünmez düz bir çizgi cizdiririz ve bu çizgiyle temasta bulunan birşey olursa istediğimiz olayları yaptırabiliriz. Benim şimdi anlatacağım olay ise bu görünmez çizgimizin bir objeye çarpınca yansıması
İlk olarak Gameobject>3dObject>Cube yolunu izleyerek bir cube nesnesi oluşturuyoruz bu nesne bizim karakterimiz olacak bu nesneden raycast çıkacak. Component>Effects>Line Renderer yolunu izleyerek objemize Line renderer atıyoruz.
Bir cs scripti oluşturarak aşağıdaki kodları içine yazıyoruz. Farkındayım kodlar karışık gözüküyor ama sorunsuz ve tam olarak istediğimiz işi yapıyor.Bu cs scriptimizi oluşturduğumuz cube objesine atıyoruz.
Raycastimiz hazır hale geliyor objeden z yönünde bir raycast çıkıyor ve önüne bir şey çıktığında 90 derecelik açıyla yansıyor. Bunu denemek için bir cube nesnesi daha oluşturup raycast’in önüne koyun.Kodlarda raycast’in üç kerelik yansımasını istediğimiz için üç kerelik yansıyacaktır eğer kendi projenize uyarlamak isterseniz Aşağıda kodların açıklamasını okuyunuz.
using UnityEngine; using System.Collections; [RequireComponent (typeof (LineRenderer))] public class RaycastReflection : MonoBehaviour { //scriptin atandığı object private Transform goTransform; //Line renderer oluşturucu private LineRenderer lineRenderer; //Bir ışın private Ray ray; //ışının çarpışma konusunda bilgisini tutmak için bir değişken private RaycastHit hit; //yansıma yönü private Vector3 inDirection; //yansımanın sayısını tutan değişken public int nReflections = 2; //line renderer noktalarının sayısı private int nPoints; void Awake () { goTransform = this.GetComponent<Transform>(); lineRenderer = this.GetComponent<LineRenderer>(); } void Update () { //yansıma kontrolü nReflections = Mathf.Clamp(nReflections,1,nReflections); //ışın oluşturma ray = new Ray(goTransform.position,goTransform.forward); //Sadece sahne sekmesinde gözükecek bir ray oluşturma Debug.DrawRay(goTransform.position,goTransform.forward * 100, Color.magenta); //noktaları yansımalara eşitler nPoints = nReflections; //line rendererlerin noktalarını ayarlar lineRenderer.SetVertexCount(nPoints); //ilk line rendererin pozisyonunu ayarlar lineRenderer.SetPosition(0,goTransform.position); //Ray ne kadar yansıyacak for döngüsü ile onun kontrolü yapılır for(int i=0;i<=nReflections;i++) { //eğer ilk yansımaysa if(i==0) { //ışının bir şeye vurup vurmadığını kontrol et if(Physics.Raycast(ray.origin,ray.direction, out hit, 100))//cast the ray 100 units at the specified direction { inDirection = Vector3.Reflect(ray.direction,hit.normal); ray = new Ray(hit.point,inDirection); Debug.DrawRay(hit.point, hit.normal*3, Color.blue); //Sadece sahne sekmesinde gözükecek bir ray oluşturma Debug.DrawRay(hit.point, inDirection*100, Color.magenta); //vurduğu objenin adını yazdır Debug.Log("Object name: " + hit.transform.name); //eğer 1.kez yansırsa if(nReflections==1) { //linerenderer yeni köşe ayarla lineRenderer.SetVertexCount(++nPoints); } lineRenderer.SetPosition(i+1,hit.point); } } else // son yansıma { //Çarpışmayı kontrol et if(Physics.Raycast(ray.origin,ray.direction, out hit, 100)) //ısın oluştur 100 birim { //yansımanın yönünü ayarla inDirection = Vector3.Reflect(inDirection,hit.normal); ray = new Ray(hit.point,inDirection); Debug.DrawRay(hit.point, hit.normal*3, Color.blue); Debug.DrawRay(hit.point, inDirection*100, Color.magenta); //çarptığı nesnenin adını yazdır Debug.Log("Object name: " + hit.transform.name); //line renderer köşesini ayarlama lineRenderer.SetVertexCount(++nPoints); //line renderer tepe konumunu ayarlama lineRenderer.SetPosition(i+1,hit.point); } } } } }