Unity3D ile sahneye saat ve gerisayım eklemek | Engin Polat'ın Windows, Web, Mobile ve Game içerikli programcılık sitesi
Ana Sayfa > Unity3D > Unity3D ile sahneye saat ve gerisayım eklemek

Unity3D ile sahneye saat ve gerisayım eklemek

27 January 2016

Bu makaleyi okumadan önce Unity3D Kategorisindeki diğer makalelerimi okumanızı tavsiye ederim.

Bu makale sonunda sahneye saati ve 60 saniyeden geri sayımı gösteren iki yazı koyabileceksiniz.

Öncelikle Unity3D‘yi açarak bir oyun projesi oluşturuyoruz;

Hierarchy panelinden Main Camera nesnesini seçiyor ve Projection özelliğinde Ortographic değeri olduğunu kontrol ediyoruz. Scene alanında tam kamera’nın arkasından bakmak için GameObject menüsü altından Align View to Selected menüsüne tıklıyoruz.

Sahneye bir Text nesnesi eklemek için Hierarchy panelinde boş bir yere sağ tuşla tıklıyor ve UI kategorisi altından Text menüsünü seçiyoruz.

Oluşturulan Canvas ve Text‘in kamera’nın gördüğü alanın içerisinde olmasını sağlamak için Canvas seçili iken Render Mode özelliğine Screen Space – Camera değerini giriyoruz. Ayrıca Render Camera özelliğine Hierarchy panelinden Main Camera nesnesini sürükleyip bırakıyoruz.

Hierarchy panelinden Text nesnesini seçip Inspector panelinde gözüken Rect Transform kategorisi altından sahnede gözükeceği konumu belirliyoruz. Örneğin sahnenin sol üst köşesinde olması için left sütunu ile top satırının kesiştiği hücreye tıklıyoruz.

Hierarchy panelinde gözüken Text nesnesine isim olarak TimerText değerini verdikten sonra Edit menüsü altından Duplicate seçeneğini seçerek aynı nesneden bir tane daha oluşturuyoruz.

Yeni oluşturduğumuz Text nesnesine isim olarak CountdownText verip, sahnenin sağ üst köşesine hizalıyoruz.

Her iki Text nesnesinin de Inspector panelinden erişilebilen Font, Font Size ve Color değerlerini değiştirerek, sahnede büyük beyaz harfler gösterecek hale getiriyoruz.

Hierarchy panelinden Canvas nesnesini seçip Inspector panelinden Add Component butonuna tıklıyoruz ve New Script seçeneğini seçiyoruz.

Canvas nesnesine eklediğimiz yeni script’e TimeManager ismini verebiliriz.

TimeManager.cs dosyasını açarak için aşağıdaki kodları yazıyoruz;

using System;
using UnityEngine;
using UnityEngine.UI;

public class TimeManager : MonoBehaviour
{
	Text timerText;
	Text countdownText;

	float countdownTo = 60.0F;

	void Start()
	{
		timerText = GameObject.Find("TimerText").GetComponent<Text>();
		countdownText = GameObject.Find("CountdownText").GetComponent<Text>();
	}

	void Update()
	{
		countdownTo -= Time.deltaTime;

		if (countdownTo > 0)
		{
			countdownText.text = countdownTo.ToString();
		}

		timerText.text = DateTime.Now.ToString("hh:MM:ss");
	}
}

Öncelikle Start() methodunda ismi TimerText ve CountdownText olan iki nesneyi bulup içlerindeki Text elementlerine erişiyoruz ve bunları birer değişkende saklıyoruz. Böylece daha sonra bu nesnelere kolay bir şekilde erişebileceğiz.

Update() methodunda 60 saniyeden geri sayma yapabilmek için countdownTo değişkeninden geçen süreyi çıkartıyoruz ve elde ettiğimiz değeri sahnedeki CountdownText nesnesinde gösteriyoruz.

Son olarak Update() methodunda DateTime sınıfının Now özelliğinden elde ettiğimiz değeri saat:dakika:saniye formatına çeviriyoruz ve sahnedeki TimerText nesnesinde gösteriyoruz.

Eğer oyunu başlatacak olursak 60 saniyeden geri sayım ve bilgisayarın saati ekranda gözükecek;


  • Emre Hayırcı

    Hocam yazınız için çok teşekkürler. Monobehaviour.FixedUpdate Monobehaviour.Update den daha avantajlı çıkarmaz mı bizi? Timer’ı o fonksiyona gömmemiz performansı arttırmaz mı?

  • Merhaba @emrehayrc:disqus, 60fps hızında çalışan bir oyunda Update (kod çalıştırdığımız) ve Draw (ekrana çizim yaptığımız) method’ları saniyede 60 defa çağırılır. Yani yaklaşık olarak her Update ve Draw method’unun işini tamamlaması için 16ms süresi oluyor.

    Eğer Update 16ms’de işini bitiremezse bile Draw methodu çağırılır ve ekrana çizim mutlaka yapılır.

    Update saniyede 60 defa çağırılamayabilir ama Draw mutlaka 60 defa çağırılır. Böylece oyunda “takılma” olmaz ;)

    FixedUpdate methodunu kullanıyorsak16ms’de işini tamamlayamadığında Draw çağırılmaz. Bu durumda Draw saniyede 60 defa çağırılmayabilir.

    Kimi durumda FixedUpdate, kimi durumda Update methodunu kullanırız ;) Eğer işin içerisine fizik hesaplama girecekse genelde FixedUpdate kullanırız, diğer durumlarda Update kullanırız diye özetleyebilirim ;)

    Daha detaylı anlatım için şu adrese göz atabilirsin; https://unity3d.com/learn/tutorials/topics/scripting/update-and-fixedupdate

  • Emre Hayırcı

    Çok teşekkür ederim hocam süpersiniz