Unity’de Paintball Silahı Yapımı

Unity’de Paintball Silahı Yapımı

26 Ocak 2020 2 Yazar: Ahmet Güler

Merhaba, bir önceki yazımızda Unity‘de asansör mekaniği oluşturmuştuk.Projemizde kullandığımız tetikleyiciler ile birlikte, asansörümüzü istediğimiz bir noktada durdurabiliyorduk.Bugünkü yazımızda ise, bir paintball silahı yapacağız ve belirlediğimiz bir hedefe ateş edeceğiz.Şimdi yeni bir proje oluşturalım ve dersimize başlayalım.

Sahnemizin hazırlanması.

Öncelikle senaryomuzu öğrenelim.Başlıktanda belli olduğu gibi bir Unity‘de bulunan nesneleri kullanarak bir paintball silahı modelleyeceğiz.Tabi bu model çok basit olacak.Çünkü asıl amacımız ateş etmeyi öğrenmek.Bunun yanında bir hedef tahtamız olacak ve ateş ettiğimiz zaman çıkan mermimiz bu tahtaya çarparak bir iz oluşturacak.Tabii paintball tabancası ile ateş edeceğimiz için, mermilerimizde rengarenk olacaktır.Şimdi bize gereken nesneleri sahnemize eklemeye başlayalım.İlk olarak bir Cube nesnesi oluşturuyoruz.

Bu nesne bizim hedef tahtamız olacak.Daha sonra bir boş nesne oluşturuyoruz.Bunu Hierarchy penceresinde sağ tıklayarak, Create Empty seçimi ile ekleyebilirsiniz.Bu yapacağımız paintball silahının parçalarını içerisinde bulunduracak.Yani ebeveyn görevi görecek.Daha sonra bu nesnemizin üzerine sağ tıklayarak silahımızın parçalarını oluşturacak nesneleri sırasıyla ekliyoruz.Ben yedi tane Cube nesnesi kullandım.Bunların Transform ayarları ile oynayarak silahımızın gövdesini meydana getiriyoruz.Daha sonra mermi koyulan haznesi için, bir tane Capsule nesnesi oluşturuyoruz.Co2 haznesi içinde bir tane Cylinder nesnesi oluşturuyoruz.

Daha sonra mermimiz için, bir Sphere nesnesi oluşturuyoruz.Bu nesneye Rigidbody bileşenini ekliyoruz.Burası önemli çünkü mermimize kuvvet vererek ileriye atacağız.Şimdi Sphere  nesnemizi Project paneline sürükleyip bırakıyoruz.Çünkü bu nesne Prefab olarak kullanılacak.Şimdi mermi izini yapmak için bir Quad nesnesi oluşturalım.Bu nesneye internetten bulacağımız bir mermi izini ekleyelim.Daha sonra bu nesneyi de, Project paneline sürükleyip bırakıyoruz.Mermi nesnemiz gibi bu nesnede Prefab olarak kullanılacak.Son olarak paintball silahımızın ebeyen nesnesine yeni bir etiket oluşturuyoruz ve ekliyoruz.Evet sahnemiz hazır.Kaplama tercihini size bırakıyorum.Sahnemizin son hali bu şekildedir.

unity_paintball_silahi_yapimi

Bize gereken kodlara bir bakalım.

Project penceresinden iki tane C# Script dosyası oluşturuyoruz.Bunlardan birini silahımızın mekaniklerini oluşturmak için kullanacağız.Diğerini ise, mermi izlerimizi oluşturmak için kullanacağız.Oluşturmuş olduğumuz ilk script dosyasını sürükleyerek, silahımızın ana nesnesinin üzerine bırakıyoruz.İkinci script dosyasını ise sürükleyerek hedefimizi oluşturan nesnenin üzerine bırakıyoruz.Şimdi ilk script dosyamızla başlayalım.

public Camera Kamera; 
public GameObject PaintballSilahi;
public GameObject PaintballSilahiNamlusu;
public GameObject PaintballMermisi;
public Color MermiRengi;
public float FareHassasiyeti = 5f; 
public float KameraninXSiniri = 30f; 
public float KameraninYSiniri = 30f; 
public float FareninXEkseni; 
public float FareninYEkseni;

Silahımızın mekaniği için kullanacağımız tüm değişkenleri tanımlıyoruz.İlk satırda, kamera nesnemizi kontrol için bir değişken tanımlıyoruz.İkinci, üçüncü ve dördüncü satırlarda paintball silahımız için GameObject değişkenleri oluşturuyoruz.Beşinci satırda, paintball silahımızdan çıkan merminin rengini tutmak için bir Color değişkeni oluşturuyoruz.

Burası önemli bir yer.Çünkü her merminin rengi rastgele belirleneceği için, oluşacak mermi izininde aynı renkte olması gerekiyor.Altıncı satırda, faremizin hassasiyetini belirlemek için float türünde bir değişken oluşturuyoruz.Yedinci ve sekizinci satırlarda, kameramızın sınırlarını belirlemek için bir değişken oluşturuyoruz.Dokuzuncu ve onuncu satırlarda ise, farenin o anki konumunu öğrenmek için değişkenler oluşturuyoruz.

Kamera = Camera.main; 
PaintballSilahi = GameObject.FindWithTag ("paintball_silahi"); 
PaintballSilahiNamlusu = GameObject.FindWithTag ("paintball_silahi").transform.GetChild (0).gameObject;
Kamera.transform.parent = GameObject.FindWithTag ("paintball_silahi").transform;  
Cursor.lockState = CursorLockMode.Locked;

Şimdi start() fonksiyonunun içerisine bu kodları yazıyoruz.İlk satırda ana kameramızı oluşturduğumuz değişkene tanımlıyoruz.İkinci satırda etiketi “paintball_silahi” olan nesnemizi değişkenimize tanımlıyoruz.Üçüncü satırda merminin çıkacağı pozisyonu belirlemek için değişkenimize, etiketi “paintball_silahi” olan nesnenin ilk alt nesnesinin yani çocuğunu eşitliyoruz.Dördüncü satırda, kamera nesnemizi etiketi “paintball_silahi” olan nesnenin çocuğu yapıyoruz.Ve son satırda ise, faremizi kilitliyoruz.

FareninXEkseni -= Input.GetAxis("Mouse Y") * FareHassasiyeti * Time.deltaTime; 
FareninYEkseni += Input.GetAxis("Mouse X") * FareHassasiyeti * Time.deltaTime; 
FareninXEkseni = Mathf.Clamp(FareninXEkseni, -KameraninXSiniri, KameraninYSiniri); 
FareninYEkseni = Mathf.Clamp(FareninYEkseni, -KameraninXSiniri, KameraninYSiniri); 
Kamera.transform.localRotation = Quaternion.Euler(18.152f, 192.92f, 1.164f); 
PaintballSilahi.transform.rotation = Quaternion.Euler(FareninXEkseni, FareninYEkseni, 0);

Bu kodları update() fonksiyonunun içerisine yazıyoruz.Genel olarak bu kodlar ile, kamerayı ve silahımızı çizdiğimiz sınırlar içerisinde hareket ettireceğiz.İlk satırda, faremizin x eksenine, y ekseninin açısını eşitliyoruz.İkinci satırda bu sefer, tam tersi bir işlem yapıyoruz.Üçüncü ve dördüncü satırlarda, Mathf.Clamp fonksiyonunu kullanarak faremizin gidebileceği maksimum ve minimum değerleri belirliyoruz.

Dördüncü satırda, kameramızın rotasyonunu ayarlıyoruz.Bunu yaparken localRotation fonksiyonunu kullanıyoruz.Buradaki değerler benim sahneme göre belirlediğim değerlerdir.Siz kendinize göre ayarlayabilirsiniz.Son satırda ise, silahımızın rotasyon değerlerini belirliyoruz.Bu kodları daha önceki yazılarımda detaylı anlattığım için özet geçtim.İsteyen o yazılara bakabilir.

if (Input.GetMouseButtonDown(0)) {
   GameObject mermi = Instantiate (PaintballMermisi, PaintballSilahiNamlusu.transform.position,PaintballSilahiNamlusu.transform.rotation) as GameObject;
   mermi.GetComponent <MeshRenderer> ().material.color = new Color (Random.Range (0f, 1f), Random.Range (0f, 1f), Random.Range (0f, 1f), 1f);
   MermiRengi = mermi.GetComponent <MeshRenderer> ().material.color;
   Rigidbody fizik = mermi.GetComponent<Rigidbody> ();
   fizik.AddForce (-transform.forward * 3000f);
}

Daha sonra yeni bir koşul oluşturuyoruz.Bu kısım mermiyi atacağımız kısmı oluşturuyor.İlk olarak, faremizin sol tuşuna basılırsa aşağıdaki işlemleri yap diyoruz.İkinci satırda mermimizin oluşması için, Instantiate fonksiyonundan yararlanıyoruz.Kullandığımız parametrelere bakacak olursak, mermi değişkenimizi yazıyoruz.Daha sonra merminin çıkacağı pozisyonu yazıyoruz.Ve son olarak merminin çıkacağı rotasyonu yazıyoruz.Üçüncü satırda, mermi nesnemizin MeshRenderer bileşenini ulşaıyoruz.

Buradan materyal rengini rastgele bir renk olacak şekilde değiştiriyoruz.Bunu yaparken Random fonksiyonunu kullanıyoruz.Parantez içerisinde sırasıyla, R-G-B tonlarını belirliyoruz.Sondaki “1f” ise, rengimizin saydamlığını belirliyor.Dördüncü satırda “MermiRengi” değişkenimize, az önce rastgele oluşan rengi eşitliyoruz.Beşinci satırda bir Rigidbody değişkeni oluşturuyoruz.Bu değişkene, mermimizin Rigidbody bileşenini eşitliyoruz.Son satırda ise, bu değişkene AddForce fonksiyonu ile kuvvet veriyoruz.

Mermi izini yapmak için kodlarımızı yazalım.

public GameObject MermiIzi;
silah SilahScripti;

Şimdi diğer script dosyamızı açıyoruz.İlk olarak değişkenlerimiz yazıyoruz.İlk satırda, mermi izi için bir GameObject oluşturuyoruz.İkinci satırda ise, ilk script dosyasından veri çekmek için değişkenimizi oluşturuyoruz.

SilahScripti = GameObject.FindWithTag ("paintball_silahi").GetComponent<silah> ();

Start() fonksiyonu içerisinde değişkenimize, etiketi “paintball_silahi” olan nesnenin script bileşenini eşitliyoruz.Böylelikle istediğimiz değişkene daha sonra erişebileceğiz.

void OnCollisionEnter (Collision Kontrol) {
   GameObject mermi = Instantiate (MermiIzi, Kontrol.transform.position, Quaternion.Euler(Kontrol.transform.rotation.x, Kontrol.transform.rotation.y, Random.Range(0, 180))) as GameObject;
   mermi.GetComponent <MeshRenderer> ().material.SetColor ("_TintColor", SilahScripti.MermiRengi);
   Destroy (Kontrol.gameObject);
}

Daha sonra bir OnCollisionEnter fonksiyonu oluşturuyoruz.Böylelikle mermimiz hedef tahtamıza çarptıktan sonra mermi izini oluşturabileceğiz.İkinci satırda Instantiate fonksiyonu ile mermi izini ekliyoruz.Bu mermi izlerinin farklı açılarda gözükmesi için, Quaternion.Euler fonksiyonunu kullanıyoruz.Bize z ekseni lazım olduğu için, “Random.Range(0, 180)” kodunu yazıyoruz.

Böylelikle mermilerimiz rastgele bir açı alıyor.Üçüncü satırda, mermi izlerimiz ile mermi rengimizin aynı olacağını söylemiştik.Bunu sağlamak için, nesnemizin MeshRenderer bileşenine erişerek “_TintColor” rengini ilk script dosyamızda kaydettiğimiz “MermiRengi” değişkeni ile değiştiriyoruz.Son olarak da, mermimizi Destroy fonksiyonu ile siliyoruz.

Evet mermi ve mermi izi için oluşturduğumuz Prefab dosyalarını, Inspector penceresinde gerekli yerlere ekledikten sonra projemiz hazır duruma geliyor.Bu yazımızın da sonuna geldik.Bir sonraki yazıda görüşmek üzere…

unity_paintball_silahi_yapimi