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);  
                }  
            }  
        }  
    }  
}  

About the author

Benan DİNDAR

Leave a Comment

Powered by themekiller.com anime4online.com animextoon.com