Unity Dersleri 9 – Mermi Şarjor Sistemi ve Reload

Unity’nin bu dersinde unity ile yapmış olduğumuz oyunda mermi sistemini öğreneceksiniz. Mermi sistemi için temel olarak ateş ettiğimiz zaman her silahta belirlediğimiz temel sınırlamalar eklememiz gerekir. Örneğin oyuna başladığımızda silahta kaç mermi olacağı, kaç şarjor olacağı ateş ettiğimizde mermi sayısı düşmesi ve şarjor yenileme işlemleri gibi…

Önceki derslerde yapmış olduğumuz ateş etme scriptinde bu ders bir kaç ekleme yaparak silahımızı biraz geliştirmiş olacağız demek yanlış olmaz. Ayrıca bu derste ekrana yazı yazmaya da giriş yapmış olacağız. Çünkü kalan mermi ve üzerimizde taşıdığımız toplamda mermi sayısını ekranda görmek isteriz. Bu derste silahımızda anlık olarak kaç mermi kaldı ve “R” tuşuna bastığımızda şarjorun dolma işlemleri, aynı şekilde şarjordeki mermi sayısının da silah kapasitesine göre düşme işlemlerini kodlayacağız.

Aşağıdaki konu videosundan nasıl yapılacağını kolay bir şekilde öğreneceksiniz. Yazım yanlışı yapmamanız durumunda problemsiz çalışacak olan kodlarımızı elle yazmak istemeyenler için de aşağıda paylaşıyorum…

 

YouTube video

 

Şimdi gelelim kodlarımıza…

 

Yukardaki videoda anlattığımız gibi mermi sistemini kullanabilmek için ateş etme scriptimizi kullandık. Aşağıda ateş etme scriptimizin mermi sistemi ile güncellenmiş versiyonunu bulabilirsiniz.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class AtesEtme : MonoBehaviour
{
RaycastHit hit;
public GameObject MermiCikisNoktasi;
public bool AtesEdebilir;
float GunTimer;
public float TaramaHizi;
public ParticleSystem MuzzleFlash;
AudioSource SesKaynak;
public AudioClip AtesSesi;
public float Menzil;
public GeriTepme recoil;
public GameObject mermiefekti;
public float mermi;
public float sarjor;
public float tasinanmermi;
float eklenenmermi;
float reloadTimer;
public Text MermiSayac;

// Start is called before the first frame update
void Start()
{
SesKaynak = GetComponent<AudioSource>();

}

// Update is called once per frame
void Update()
{

MermiSayac.text = “” + mermi + “/” + tasinanmermi;
eklenenmermi = sarjor – mermi;
if (eklenenmermi > tasinanmermi)
{
eklenenmermi = tasinanmermi;
}

if (Input.GetKeyDown(KeyCode.R) && eklenenmermi > 0 && tasinanmermi > 0)
if (Time.time > reloadTimer)
{
StartCoroutine(Reload());
reloadTimer = Time.time;
}
if (Input.GetKey(KeyCode.Mouse0) && AtesEdebilir == true && Time.time > GunTimer && mermi > 0)
{
Fire();
GunTimer = Time.time + TaramaHizi;
recoil.Fire();
Instantiate(mermiefekti, hit.point, Quaternion.LookRotation(hit.normal));

}
}

void Fire()
{
if (mermi <= 0)
{
AtesEdebilir = false;
}
if (mermi > 0)
{
AtesEdebilir = true;
mermi–;
}
if (Physics.Raycast(MermiCikisNoktasi.transform.position, MermiCikisNoktasi.transform.forward, out hit, Menzil))
{
MuzzleFlash.Play();
SesKaynak.Play();
SesKaynak.clip = AtesSesi;
Debug.Log(hit.transform.name);
}
}
IEnumerator Reload()
{
yield return new WaitForSeconds(1.2f);
mermi = mermi + eklenenmermi;
tasinanmermi = tasinanmermi – eklenenmermi;
}
}

 210 kez bu yazı okundu.,  1 kişi bugün inceledi.