"yandex-verification" content="ef2e7dca9790d4b5" />

Unity Ray ile Cisimlerden Yansıyan Lazer Yapımı

Unity de oyun tasarlarken işinize yarayacağını düşündüğüm lazer ve bu lazerin cisimlerden yansımasını sağlayacak scriptimi bu yazıda anlatarak paylaşacağım.


Öncelikle ihtiyacımız olan değişkenleri tanımlayalım:



using UnityEngine;


public class Lazer : MonoBehaviour

{

private Ray ray;

private RaycastHit hit;

bool isReflected = false;

[Range(1,1000)]

public float maxLazerLenght;

public float remainedLenght;

Vector3 ReflectPosition;

private Vector3 ReflectDirection;

}



Burada isReflected ile bir cisme çarpıp çarpmadığımızı kontrol edeceğiz. maxLazerLenght kadar toplam uzunluğumuz olacak ve her çarpmada kalan uzunluğu remainedLenght ile tutacağız. ReflectPosition lazer parçasının başlangıcını ReflectDirection ise yönünü tutacak. Bunlar başlangıçta lazerin ilk çıkış noktası olan transform.position ve transform.direction olacak. Bu yüzden Start methodumuz şöyle;


private void Start()

{

remainedLenght = maxLazerLenght;

ReflectPosition = transform.position;

ReflectDirection = transform.forward;

}



Çizim işlemimiz Update methodu ile olacak siz isterseniz doğrudan Update içine yazabilirsiniz. Ben bunun için kendi UpdateLazer methodumu yazarak onu Update içinde çağıracağım. Burada do-while döngüsü ile lazerim bir yerden sekmeyip max uzunluğa erişene kadar yansıtıp kalan kısmını kontrol edeceğim. Şöyle ki;



void UpdateLazer()

{

do

{

float distance;

ray = new Ray(ReflectPosition, ReflectDirection);//çıkış noktasından ray çiziyoruz

if (Physics.Raycast(ray.origin, ray.direction, out hit, remainedLenght))//eğer bir nesneye çarparsak

{

distance = Vector3.Distance(ReflectPosition, hit.point);//mesafe

remainedLenght -= distance; //kalan uzunluk

Debug.DrawRay(ReflectPosition, ReflectDirection * distance, Color.red);//mesafe kadar ray çiziyoruz

ReflectDirection = Vector3.Reflect(ray.direction, hit.normal);//yansıma sonrası yüzeyin normali üzerinden yeni yönümüzü buluyoruz

ReflectPosition = hit.point;//sonraki parçanın başlangıç noktası çarptığımız nokta

Reflected = true;//Yansıma kontrolü

}

else//Eğer önümüze birşey çıkmazsa

{

Debug.DrawRay(ReflectPosition, ReflectDirection * remainedLenght, Color.red);//kalan kısmı çiziyoruz

Reflected = false;

}

}

} while (Reflected && remainedLenght > 1);// cisim yoksa veya 1 birimden daha küçük parça kaldıysa bitiriyoruz


//degişkenleri resetliyoruz

remainedLenght = maxLazerLenght;

ReflectPosition = transform.position;

ReflectDirection = transform.forward;

}




Açıklama satırlarında herbiri için ne yapıldığını özetle belirttim. Son Olarak bu methodu Update içinde çağırıyoruz.


void Update()

{

UpdateLazer();

}


Şimdi de Editor de neler olduğunu görelim.



Her türlü soru ve düşünceleriniz için yorum kısmından yazabilirsiniz.






7 görüntüleme
BE IN

TOUCH

Please fill your contact details below: