Unity’de El Feneri Yapımı 2 (Pil Doldurma & Animasyon)
Merhaba, bir önceki dersimizde Unity ile el feneri yapımına başlamıştık.İlk bölümde ne yaptığımızı kısaca hatırlayacak olursak, projemizde kullanacağımız senaryo için sahnemizi hazırlamıştık.Daha sonra el fenerimizi bu sahneye dahil ederek, nesnemize gerekli bileşenleri ve bu bileşenler için gerekli ayarları yapmıştık.Şimdi ise el fenerimize birkaç fonksiyon daha ekleyeceğiz.Ekleyeceğimiz bu fonksiyonlara yazıya başlamadan önce yüzeysel olarak değinmek istiyorum.
Öncelikle basit bir pil gösterge arayüzü oluşturacağız.Daha sonra oyuncumuzu hareket ettirirken, el fenerimizin daha gerçekçi görünmesi için basit bir animasyon ekleyeceğiz.Tabi el fenerimiz açık kaldığı süre içerisinde pili azalacak.Tekrar doldurmak için bir fonksiyon oluşturacağız.Ve son olarak, el fenerimize açma/kapatma sesi ekleyeceğiz.Tabi daha fazla detay eklemekte mümkündür.Şimdi projemizin kalanına başlayabiliriz.
Pil Göstergesini oluşturmaya başlayalım.
Şimdi Hierarchy penceresinde sağ tıklayarak sırasıyla UI > Canvas seçimini yapıyoruz.Daha sonra Canvas nesnemizi seçiyoruz ve Inspector penceresine geliyoruz.Burada yer alan Canvas Scaler bileşeninde birkaç düzenleme yapmamız gerekiyor.Öncelikle UI Scale Mode ayarını Scale With Screen Size olarak değiştiriyoruz.Daha sonra aşağıya açılan Reference Resolution bölümüne istediğiniz bir çözünürlük değerini yazıyoruz.Tavsiyem Full HD yani 1920×1080 bir değer girmenizdir.
Batarya göstergesi için internetten bulduğumuz bir ikon işimizi görecektir.Yalnız burada dikkat etmeniz gereken bir nokta bulunuyor.İnternetten seçeceğimiz batarya göstergesinin içerisi dolu yada boş olabilir.Eğer dolu ise, basit bir photoshop işlemi ile içerisini dış çerçeveden ayırabiliriz.Böylece Unity‘de kullanmak üzere elimizde iki dosya olur.Eğer seçtiğimiz Batarya göstergesi boş olursa, bu seferde Unity‘de Canvas nesnesi üzerinde doldurma işlemini yapabiliriz.Ben ilk yolu yani, dolu bataryayı iki görsele ayırarak yapacağım.
Batarya göstergesi için kullanacağımız görselleri Project penceresine sürükleyerek bırakıyoruz.Daha sonra sırasıyla üzerlerine tıklıyoruz ve Inspector penceresinde Texture Type ayarını Sprite (2D and UI) olarak değiştiriyoruz.Bu şekilde birazdan Canvas içerisine ekleyeceğimiz Image nesnemizde bu görselleri kullanabileceğiz.Aynı pencerede daha başka ayarlarda görüyoruz ancak şimdilik onlarla bir işimiz yok.
Şimdi Hierarchy penceresine geri dönelim.Canvas nesnemizin üzerine sağ tıklayarak sırasıyla UI > Image seçimini yapıyoruz.Eklediğimiz bu ilk Image nesnemiz bizim pil göstergemizin çerçevesini oluşturacak.Inspector penceresine geliyoruz.Image bileşeninde bulunan Source Image bölümünü Project penceresinde bulunan pil çerçevemizi sürükleyerek bırakıyoruz.Daha sonra Image Type ayarını Simple olarak değiştiriyoruz.Son olarak Preserve Aspect ayarını aktif ediyoruz.
Scene penceresinde bulunan yardımcı araçları kullanarak pil göstergemizin konumunu istediğimiz yere getiriyoruz.Şimdi tekrar Canvas nesnemizin alt nesnesi (child) olan Image üzerine sağ tıklayarak sırasıyla UI > Image seçimini yapıyoruz.Inspector penceresine geliyoruz.Image bileşeninde bulunan Source Image bölümünü Project penceresinde bulunan pil göstergesinin ikinci kısmını yani pil durum çubuğunu sürükleyerek bırakıyoruz.
Daha sonra Image Type ayarını Filled olarak değiştiriyoruz.Bu ayarı ilk Image nesnesinden farklı yapmamızın sebebi ise, burada kullanacağımız görseli dinamik olarak kullanacağımız içindir.Bu seçim ile birlikte aşağıda yeni bir ayar bölümü açılacaktır.Fill Method ayarı ile doldurma yönteminin nasıl olacağını seçebiliyoruz.Burada biz Horizontal yani yatay bir doldurma seçimi yaptık.Fill Origin ayarı ile de doldurma yönteminin yönünü ayarlayabiliyoruz.Burada Left yani soldan doldurma olmasını seçtik.
Fill Amount ayarı ise, dolum miktarı yani seçtiğimiz görselin ne kadarının sahnede gösterileceğini belirliyor.Bu ayar 0-1 arasında bir değer alıyor.Örneğin 0.5 gibi bir değer verecek olursak, görselimizin sadece yarısını sahnede göstercektir.Bizde yazacağımız kodda bu ayara erişerek dinamik olarak değerini değiştireceğiz.Şimdi bu Image nesnemize yeni bir etiket veriyoruz.Çünkü nesneye erişmek için bu etiketi kullanacağız.Son olarak Preserve Aspect ayarını aktif ediyoruz.
El feneri animasyonu oluşturmaya başlayalım.
Evet şimdi Project penceresinde yeni bir C# Script dosyası oluşturuyoruz.Bu script dosyasını oyuncu hareketi ile birlikte el fenerimizin de hareket etmesi için kullanacağız.Şimdi script dosyamızı editör yardımı ile açıyoruz ve kodlarımızı yazmaya başlıyoruz.
public Transform ElFeneri;
İlk olarak script dosyamızda kullanacağımız değişkenleri tanımlıyoruz.Burada yeni bir Transform değişkeni oluşturuyoruz.Bu değişken ile el fenerimize erişerek, bu nesneyi kontrol edebileceğiz.
ElFeneri = GameObject.FindWithTag("fener").transform;
Bu kodları ise, start() fonksiyonumuzun içerisine yazıyoruz.İlk satırda bulunan “ElFeneri” ismindeki değişkenimize, etiketi “fener” olan nesnemizin transform değerlerini eşitliyoruz.Artık bu nesnemizi transform değerlerini kontrol edebileceğiz.
Şimdi update() fonksiyonumuzun içerisine aşağıdaki kodları yazıyoruz.İlk satırda yeni bir koşul oluşturuyoruz.Eğer klavyeden “W-A-S-D” tuşlarından birine basıldığı takdirde koşulumuz aktif oluyor.Burada “||” operatörü yada anlamına geliyor.Yani dört tuştan herhangi bir tanesine basılması koşulumuzun doğru olması için yeterli oluyor.Böylece hareket ettiğimiz sürece el feneri animasyonumuz çalışacaktır.
İkinci satıra gelecek olursak, “ElFeneri” değişkenimize tanımlı nesnemizin localPosition değerine yeni bir Vector3 oluşturarak eşitliyoruz.Burada Vector3 fonksiyonumuzun parantez içerisine geçmeden önce localPosition fonksiyonunu biraz açmak istiyorum.Zira daha önceki yazılarımda anlattığım gibi bu yazıda da atlamamam gereken önemli bir detaydır.Hierarchy penceresine baktığımız zaman FirstPersonCharacter altında el feneri nesnesini görüyoruz.
if (Input.GetKey(KeyCode.W) || Input.GetKey(KeyCode.S) || Input.GetKey(KeyCode.A) || Input.GetKey(KeyCode.D)) { ElFeneri.localPosition = new Vector3(ElFeneri.localPosition.x, ElFeneri.localPosition.y, Mathf.Lerp(0.5f, 1f, Mathf.PingPong(Time.time , 0.5f))); }
Bu FirstPersonCharacter ve el feneri nesneside kendi içerisinde ebeveyn-çocuk (parent-child) ilişkisi içerisindedirler.Bu yüzden el feneri nesnesinin position bilgilerini doğru çekebilmek adına localPosition fonksiyonundan yararlanıyoruz.Çünkü bu nesne tek başına ana nesne görevinde değildir.Bu da pozisyon bilgilerinin başka bir nesneye bağlı olarak değiştiği anlamına geliyor.Şimdi kaldığımız yerden devam edelim.
Vector3 fonksiyonumuzun parantez içeresinde sırasıyla “ElFeneri” nesnemizin x pozisyonu, “ElFeneri” nesnemizin y pozisyonu yer alıyor.Burada hareket etmesini istediğimiz eksen z olduğu için diğer eksenleri, nesnemizin kendi pozisyon bilgilerini çekerek değiştirmiyoruz.Z eksenine geldiğimiz zaman ise Mathf.Lerp fonksiyonunu görüyoruz.Bu fonksiyonu daha önceki yazılarımda sıkça kullanmıştık.
Kısaca nesneyi bir noktadan diğer noktaya yumuşak bir şekilde geçiş yaptırmaya yarıyor.Yine bu fonksiyonda üç tane parametre alıyor.Birinci ve ikinci değerler başlangıç ve bitiş noktalarını belirliyor.Üçüncü değer ise hızını belirliyor.Ancak biz burada tekrar bir fonksiyon kullanıyoruz.Bunun nedeni ise, bu el feneri hareketinin biz yürümeye devam ettikçe sürdürülebilmesi içindir.İşte Mathf.PingPong fonksiyonu tamda bu işe yarıyor.
El feneri kontrolu için kodlarımızı yazmaya başlayalım.
Şimdi ikinci C# Script dosyamızı oluşturalım.Bu script dosyamızı ise, el fenerimiz için belirleyeceğimiz mekanikler için kullanacağız.Script dosyamızı editör yardımı ile açarak kodlarımızı yazmaya başlayabiliriz.
using UnityEngine.UI;
Kodlarımızı yazmaya başlamadan önce script dosyamızın kütüphane kodlarının olduğu bölümüne bu kütüphaneyi de dahil ediyoruz.Böylece artık arayüz (UI) elemanlarımızı da kontrol edebileceğiz.
public GameObject ElFeneri; [Header("Fener Işıkları")] public GameObject[] Isiklar; public bool IsigiAc; [Header("Pil Göstergesi")] public Image PilIkonu; [Header("Pil Durumu")] public float MaksimumPil; public float PilOmru; public bool PilKontrol;
Her zamanki gibi değişkenlerimizi tanımlamakla başlıyoruz.Bu script dosyamızda birden çok mekanik olacağı için değişkenleri gruplara ayırmayı uygun gördüm.Bunuda Header kodu ile başlıklar vererek sağlıyoruz.Böylece karışıklığın önüne geçmiş olacağız.İlk satırda GameObject değişkeni oluşturuyoruz.Bu değişkeni el fenerimizi kontrol etmek için kullanacağız.
Üçüncü satırda bir GameObject dizisi oluşturuyoruz.Burada bir dizi kullanmamızın nedeni ise, sahnemizde iki ışık olması ve iki ışığı da aynı anda kontrol etmek içinidir.Dördüncü satırda bool türünde bir değişken oluşturuyoruz.Bu değişken ile, ışıklarımızı kontrol edebileceğiz.Altıncı satırda bir Image değişkeni oluşturuyoruz.Bu değişken ile de, pil gösterge ikonumuzu kontrol edeceğiz.
Sekizinci ve dokuzuncu satırlarda float türünde değişkenler oluşturuyoruz.Bu değişkenler ile el fenerimizin yedek pil sayısını ve kalan bil ömrünü kontrol edebileceğiz.Son satırda ise bool türünde bir değişken oluşturuyoruz.Bu değişken ile de el fenerimizin pillerini kontrol edebileceğiz.
[Header("Pil Doldurma Animasyonu")] public float IsikDalgalanmaSuresi; public bool YeniPil; public bool aciAktif; public float FenerAcisi; public float DondurmeHizi; [Header("Toplam Pil Hakkı")] public int PilHakki; [Header("Açma Kapama Sesi")] public AudioSource Ses; public AudioClip TusSesi;
Değişkenlerimizi tanımlamaya devam ediyoruz.İkinci satırda float türünde bir değişken oluşturuyoruz.Bu değişkeni el fenerimizin pili azaldığı zaman bir dalgalanma yapmak için kullanacağız.Üçüncü ve dördüncü satırlarda bool türünde değişkenler tanımlıyoruz.Bu değişkenler ile pilin durumunu ve el fenerimizin doldurma açısını kontrol edeceğiz.Beşinci ve altıncı satırlarda ise float türünde değişkenler oluşturuyoruz.Burada ise fenerimizin açı değerlerini ve döndürme hızını kontrol edeceğiz.
Sekizinci satırda integer (int) türünde bir değişken tanımlıyoruz.Bu değişkeni ise, toplam pil hakkımızı belirlemek için kullanacağız.Dokuzuncu satırda AudioSource değişkeni oluşturuyoruz.Bu değişkeni fenerimizin açma/kapatma sesini kontrol etmek için kullanacağız.Son satırda ise AudioClip değişkeni oluşturuyoruz.Bu değişkeni ise, açma kapatma sesini belirlemek için kullanacağız.
ElFeneri = GameObject.FindWithTag("fener"); Isiklar = GameObject.FindGameObjectsWithTag("isik"); foreach (GameObject IsikKontrolu in Isiklar) { IsikKontrolu.GetComponent<Light>().enabled = false; } PilIkonu = GameObject.FindWithTag("pil").GetComponent<Image> (); Ses = GetComponent<AudioSource>();
Şimdi bu kodları start() fonksiyonumuzun içerisine yazıyoruz.İlk satırda değişkenimize, etiketi “fener” olan nesnemizi tanımlıyoruz.İkinci satırda değişkenimize etiketleri “isik” olan nesnelerimizi tanımlıyoruz.Burada iki satır arasındaki farka bakacak olursak, bir tanesi ilk bulduğu etiketi çeker.Diğeri ise, aynı etikete sahip tüm nesneleri çeker.Üçüncü satırda yeni bir foreach döngüsü başlatıyoruz.
Bu döngüyü kullanmamızın nedeni, birden fazla ışık nesnemiz olduğu için ve hepsini aynı anda kontrol edebilmek içindir.Dördüncü satırda, ışık nesnelerimizin Light bileşenine erişiyoruz ve kapatıyoruz.Böylece projemizi başlattığımız zaman el fenerimizin ışıkları yanmayacaktır.Beşinci satırda değişkenimize, etiketi “pil” olan nesnemizin Image bileşenini tanımlıyoruz.Artık pil ikonumuzu kontrol edebileceğiz.Son satırda ise değişkenimize script dosyamızın ekli olduğu nesnenin AudioSource bileşenini tanımlıyoruz.
MaksimumPil = 10f; PilOmru = MaksimumPil; FenerAcisi = 360f; DondurmeHizi = 300f; PilHakki = 2;
Start() fonksiyonumuzun devamına bu kodları yazıyoruz.İlk satırda “MaksimumPil” değişkenimize yeni bir değer veriyoruz.Bu değer el fenerimizin ne kadar süre boyunca açık kalacağını belirleyecektir.İkinci satırda “PilOmru” değişkenimizin değerini “MaksimumPil” değişkenimizin değerine eşitliyoruz.Çünkü bu değer “MaksimumPil” değişkenimize tanımlı değerin üzerine çıkmaması gerekiyor.
Üçüncü satırda “FenerAcisi ” değişkenimizin değerini belirliyoruz.Burada “360” yazmamızın sebebi ise, el fenerimizin pil doldurma işlemi sırasında 360 derece dönmesini istediğimiz içindir.Dördüncü satırda “DondurmeHizi” değişkenimizin değerini belirliyoruz.Buraya el fenerinizin ne kadar hızlı dönmesini istiyorsanız o kadar fazla bir değer vermeniz gerekiyor.Son satırda ise, “PilHakki” değişkenimizin değerine el fenerimize takılacak maksimum pil değerini yazıyoruz.
El fenerine yeni pil takmak.
Şimdi el fenerimizin pilleri bittiği zaman yenilemek için bir fonksiyon oluşturalım.Tabi bununla birlikte pilleri yenilerken bir animasyonda oluşturacağız.
void PilDoldur() { if (Input.GetKeyDown(KeyCode.R)) { YeniPil = true; PilHakki -= 1; } }
Evet ilk satırda yeni bir fonksiyon oluşturuyoruz.İkinci satırda bir koşul oluşturuyoruz.Eğer klavyeden “R” tuşuna basılırsa koşulumuz aktif oluyor.Üçüncü satırda “YeniPil” değişkenimizin değerini true olarak değiştiriyoruz.Dördüncü satırda ise, “PilHakki” değişkenimizin değerini bir “1” azaltıyoruz.Bunu yapmak için “-=” kullanabilirsiniz yada “PilHakki = PilHakki – 1” olarak da yazabilirsiniz.
if (YeniPil && PilHakki > 0) { float FeneriDondur = DondurmeHizi * Time.deltaTime; if (FenerAcisi > FeneriDondur) { FenerAcisi -= FeneriDondur; ElFeneri.transform.Rotate(0,0,FeneriDondur); } else { YeniPil = false; FeneriDondur = FenerAcisi; FenerAcisi = 0; PilOmru = MaksimumPil; PilIkonu.fillAmount = 1f; } }
PilDoldur() fonksiyonumuzun içerisine bu kodları da yazıyoruz.İlk satırda yeni bir koşul oluşturuyoruz.Eğer “YeniPil” değişkenimizin değeri true ve “PilHakki” değişkenimizin değeri, sıfırdan “0” büyükse koşulumuz doğru oluyor.İkinci satırda float türünde yeni bir değişken oluşturuyoruz.Bu değişkenimize, “DondurmeHizi” değişkenimizin değerini Time.deltaTime fonksiyonumuz ile çarparak tanımlıyoruz.
Üçüncü satırda yeni bir koşul daha oluşturuyoruz.Eğer “FenerAcisi” değişkenimizin değeri “FeneriDondur” değişkenimizin değerinden büyükse koşulumuz aktif oluyor.Dördüncü satırda ise, “FenerAcisi” değişkenimizin değerini “FeneriDondur” değişkenimizin değeri kadar azaltıyoruz.Beşinci satırda ise “ElFeneri” değişkenimize tanımlı nesnemizi Rotate fonksiyonu yardımı ile döndürüyoruz.Parantez içerisinde ise sadece z ekseninde bir işlem yapıyoruz.Diğer eksenlerimiz sıfır “0” olarak kalıyor.
Altıncı satırdan itibaren eğer koşulumuz aktif olmazsa olacakları yazıyoruz.Yedinci satırda, “YeniPil” değişkenimizin değeri false olarak değiştiriyoruz.Sekizinci satırda “FeneriDondur ” değişkenimizin değerini “FenerAcisi” değişkenimizin değerine eşitliyoruz.Dokuzuncu satırda, “FenerAcisi” değişkenimizin değerini sıfırlıyoruz.Onuncu satırda “PilOmru” değişkenimizin değerini “MaksimumPil” değişkenimizin değerine eşitliyoruz.Son satırda ise, “PilIkonu” değişkenimize tanımlı bileşenimizin fillAmount özelliğinin değerini bir “1” olarak değiştiriyoruz.
El fenerine ışık dalgalanması eklemek.
Şimdi yeni bir fonksiyon oluşturma zamanı geldi.Başlıktan anlatmak istediğimi başarıyla aktarabildim mi bilmiyorum ama biraz detaya gireyim.El fenerlerinde eğer piller tükenme noktasına gelmişse, ışıklarında açılıp/kapanan bir dalgalanma olur.İşte bizde bu efekti yapmış olduğumuz el fenerine eklemeye çalışacağız.
IEnumerator PilDurumu () { while (PilKontrol) { foreach (GameObject IsikKontrolu in Isiklar) { IsikKontrolu.GetComponent<Light>().enabled = false; } IsikDalgalanmaSuresi = Random.Range(0.01f, 0.1f); yield return new WaitForSeconds (IsikDalgalanmaSuresi); ... } }
Oluşturduğumuz bu fonksiyonu IEnumerator metodu ile yapacağız.İkinci satıra bakacak olursak, yeni bir while döngüsü oluşturuyoruz.Koşul olarak eğer “PilKontrol” değişkeninin değeri true olursa döngümüzü aktif edeceğiz ve değişkenimizin değeri false olana kadar da döngüden çıkmayacağız.Üçüncü satırda yeni bir foreach döngüsü oluşturuyoruz.
Birden fazla ışık nesnemiz olduğu için ve hepsini aynı anda kontrol edebilmek için foreach döngüsünü kullanıyoruz.Dördüncü satırda, ışık nesnelerimizin Light bileşenine erişiyoruz ve kapatıyoruz.Altıncı satırda “IsikDalgalanmaSuresi” değişkenimizin değerine 0.01 – 0.1 arasında rastgele bir sayı atıyoruz.Bu işlemi Random.Range fonksiyonu ile yapıyoruz.Yedinci satırda ise, WaitForSeconds fonksiyonu ile “IsikDalgalanmaSuresi” değişkeninin değeri kadar bekletiyoruz.
foreach (GameObject IsikKontrolu in Isiklar) { IsikKontrolu.GetComponent<Light>().enabled = true; } IsikDalgalanmaSuresi = Random.Range(0.01f, 0.1f); yield return new WaitForSeconds (IsikDalgalanmaSuresi);
While döngümüzün devamına bu kodları yazıyoruz.Yine yukarıdaki satırlarda açıkladığım olaylar bu kodlar içinde geçerlidir.Yalnız ikinci satırda bulunan ışık nesnelerimizin Light bileşeni bu sefer false yerine true değerine getiriyoruz.Böylece belirlediğimiz aralıklarda ve belirsiz sürelerde yanıp sönen ışıklarımız olmuş oluyor.Eğer rastgele süreler yerine sabit bir süre tercih ederseniz, Random.Range fonksiyonunu silmeniz yeterlidir.
El feneri açma/kapatma sesi ve pil gösterge ikonu kontrolü yapmak.
Evet şimdi el fenerimizin diğer mekaniklerini oluşturacağız.Bunlar ses kontrolü ve batarya göstergesi kontrolü olacak.Şimdi kodlarımızı yazmaya devam edelim.
void FenerAcKapat() { if (Input.GetKeyDown(KeyCode.F)) { IsigiAc = !IsigiAc; if (!Ses.isPlaying) { Ses.clip = TusSesi; Ses.PlayOneShot(TusSesi); } } ... }
İlk satırda yeni bir fonksiyon oluşturuyoruz.İkinci satırda yeni bir koşul oluşturuyoruz.Eğer klavyeden F tuşuna basarsak, koşulumuz aktif oluyor.Üçüncü satırda “IsigiAc” bool türündeki değişkenimizin değerini tam terse olacak şekilde değiştiriyoruz.Yani eğer değişkenimizin değeri true ise false yapıyoruz.Tam tersi bir durumda ise true yapıyoruz.Dördüncü satırda yeni bir koşul daha oluşturuyoruz.
Eğer sahnemizde herhangi bir ses oynatılmıyor ise koşulumuz aktif oluyor.Bunu kontrol etmek içinde AudioSource bileşenimizin isPlaying özelliğini kullanıyoruz.Beşinci satırda “Ses” değişkenimize tanımlı AudioSource bileşeninin clip bölümüne “TusSesi” değişkenimizde tanımlı olan sesi eşitliyoruz.Altıncı satırda ise, tanımlı olan bu sesi bir kere oynatıyoruz.Bunu ise, PlayOneShot fonksyonu ile sağlıyoruz.
if (IsigiAc && PilOmru != 0) { foreach (GameObject IsikKontrolu in Isiklar) { IsikKontrolu.GetComponent<Light>().enabled = true; } PilOmru -= Time.deltaTime; PilIkonu.fillAmount = PilOmru / MaksimumPil; PilKontrol = true; if (PilKontrol && PilIkonu.fillAmount < 0.20f) { StartCoroutine (PilDurumu()); } }else { foreach (GameObject IsikKontrolu in Isiklar) { IsikKontrolu.GetComponent<Light>().enabled = false; } IsigiAc = false; PilKontrol = false; }
Bu kodları yukarıdaki fonksiyonumuzun devamına yazıyoruz.İlk satırda yeni bir koşul oluşturuyoruz.Eğer “IsigiAc” değişkenimizin değeri true ve “PilOmru” değişkenimizin değeri sıfır “0” değilse koşulumuz aktif oluyor.İkinci satırda, yeni bir foreach döngüsü oluşturuyoruz.Birden fazla ışık nesnemiz olduğu için ve hepsini aynı anda kontrol edebilmek için foreach döngüsünü kullanıyoruz.Bundan az öncede bahsetmiştik.Üçüncü satırda, ışık nesnelerimizin Light bileşeninin değerini true olarak belirliyoruz.
Beşinci satırda “PilOmru” değişkenimizin değerini “-=” kullanarak azaltıyoruz.Tabi bu azaltma işleminde Time.deltaTime fonksiyonunu kullanıyoruz.Altıncı satırda ise, “PilIkonu” değişkenimizde tanımlı Canvas nesnemizin Image bileşeninde bulunan fillAmount değerini “PilOmru / MaksimumPil” işlemi sonucunda çıkan değere eşitliyoruz.Böylece sahnemizde gözüken pil durumu göstergemiz dinamik olarak değişecektir.
Yedinci satırda, “PilKontrol” değişkenimizin değerini true olarak değiştiriyoruz.Sekizinci satırda yeni bir koşul daha oluşturuyoruz.Eğer “PilKontrol” değişkenimizin değeri true ise ve “PilIkonu” değişkenimizde tanımlı Canvas nesnemizin Image bileşeninde bulunan fillAmount değeri, “0.20f” değerinden küçük ise kouşulumuz aktif oluyor.Dokuzuncu satırda ise, StartCoroutine fonksiyonu ile daha önce oluşturmuş olduğumuz “PilDurumu” fonksiyonumuzu çağırıyoruz.
Onbirinci satırda eğer koşulumuz istenilen kriterleri karşılamıyor ise else tarafına geçiyoruz.Onikinci satırda, yeni bir foreach döngüsü oluşturuyoruz.Onüçüncü satırda, ışık nesnelerimizin Light bileşeninin değerini false olarak ayarlıyoruz.Onbeşinci satırda “IsigiAc” değişkenimizin değerini false olarak ayarlıyoruz.Onaltıncı satırda yine “PilKontrol” değişkenimizin değerini false olarak ayarlıyoruz.
El fenerimizin son kontrollerini yapmak.
if (PilOmru <= 0) { PilOmru = 0; } if (PilHakki <= 0) { PilHakki = 0; } FenerAcKapat(); PilDoldur();
Evet son olarak, yazmış olduğumuz bu fonksiyonları update() fonksiyonumuzun içerisine ekliyoruz.Yalnız bunda daha önce birkaç satır daha kod yazmamız gerekiyor.Zira istemediğimiz durumların önüne ancak bu şekilde geçebiliyoruz.İlk satıra bakacak olursak, yeni bir koşul oluşturuyoruz.Eğer “PilOmru” değişkenimizin değeri sıfırdan “0” küçük yada sıfıra “0” eşit ise koşulumuz aktif oluyor.
İkinci satırda “PilOmru” değişkenimizin değerini sıfıra “0” eşitliyoruz.Bu kontrolü yapmamızın nedeni ise arka planda “PilOmru” değişkenimizin değerinin sıfırın altına düşmesini engellemek içindir.Aksi takdirde Time.deltaTime fonksiyonu ile eksi değerlere inmeye devam eder.Dördüncü satırda yine bir koşul oluşturuyoruz.Bu sefer, eğer “PilHakki” değişkenimizin değeri sıfırdan “0” küçük yada sıfıra “0” eşit ise koşulumuz aktif oluyor.
Bunu yapmamızın sebebi de, bizim belirlediğimiz pil hakkı eğer sıfıra “0” inerse her feneri açıp/kapattığımız zaman bu değerin eksiye inmesini engellemek içindir.Bunun içinde beşinci satırda “PilHakki” değişkenimizin değerini sıfıra “0” eşitliyoruz.Yedinci ve sekizinci satırlarda da, daha önceden oluşturmuş olduğumuz fonksiyonları yazıyoruz.Şimdi Unity‘e geri döniyoruz.Hierarchy penceresindeki el feneri nesnemizi seçiyoruz.Daha sonra Inspector penceresinde en altta yer alan Add Component butonuna tıklıyoruz ve Audio Source bileşenini ekliyoruz.
Yazmış olduğumuz iki C# Script dosyası bulunuyor.Bunlardan ilkini yani el feneri animasyonu için oluşturduğumuz script dosyasını, “FirstPersonCharacter” nesnemizin üzerine sürükleyerek bırakıyoruz.İkincisini yani el feneri kontrolerimizin bulunduğu script dosyasını ise, el feneri nesnemizin üzerine sürükleyerek bırakıyoruz.İnternetten bulduğumuz bir ses efektini ise “TusSesi” bölümüne sürükleyerek bırakıyoruz.Artık test edebiliriz.Evet artık projemizin sonuna gelmiş bulunmaktayız.Bir sonraki yazıda görüşmek üzere..
PİL TEKRAR DOLMUYOR NASIL ÇÖZEBİLİRİM
Merhaba, eğer arayüz bölümünü oluştururken atlanılan bir nokta olmadıysa ve bunun üzerine pil gösterge ikonu dolmuyorsa koddaki “fillAmount” bölümlerini tekrar incelemenizi öneririm.