timeScale ile Duraklatma
Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 34 / 60.
Time.timeScale oyun zamanının ne kadar hızlı aktığını belirler: 1 normal hızdır, 0 ise zamanı durdurur. Değer 0 olduğunda Time.deltaTime 0 olur; bu nedenle speed * Time.deltaTime şeklinde yazılmış tüm hareketler durur. FixedUpdate() artık çağrılmaz, bu yüzden Rigidbody'ler havada asılı kalır. Oyun zamanını saydıkları için WaitForSeconds ve Invoke da bekler. Bu betik, On Click listesi TogglePause işlevini çağıran bir düğmeyle duraklatmayı açıp kapatır ve duraklatma sırasında bir panel gösterir:
public class PauseToggle : MonoBehaviour
{
public GameObject pausePanel;
bool paused;
public void TogglePause()
{
paused = !paused;
Time.timeScale = paused ? 0f : 1f;
pausePanel.SetActive(paused);
}
}Her şey durmaz. Update() ve LateUpdate() her karede çağrılmaya devam eder; Time.deltaTime 0 olur, bir coroutine içindeki yield return null bir sonraki karede yine devam eder ve kullanıcı arayüzü tıklamaları almaya devam eder. Düğme böylece duraklatmayı sona erdirebilir. Tuşlar da okunmaya devam eder: Update() içinde Space tuşuna basıldığında zıplayan bir kurbağa, duraklatma sırasında tuşa basıldığını algılar ve duraklatma bittikten sonraki ilk fizik adımında sıçrar. Betiği, zaman durduğunda tuşları yok sayar:
void Update()
{
if (Time.timeScale == 0f) return; // duraklatıldı: tuşları yok say
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
}
}Time.timeScale bir sahneye değil, oyunun tamamına aittir: değeri 0 iken başka bir sahne yüklersen yeni sahne duraklatılmış olarak başlar. Bir seviyeyi yeniden başlatan veya oyundan çıkan menü düğmesi, önce değeri yeniden 1 yapar.
Görev
OrtaTenis kortuna bir duraklatma menüsü ekle. Sahne, Duraklat ve Devam Et düğmelerini bağlar.
PauseMenu.csiçindePause(),Time.timeScale = 0f;değerini ayarlar vepanel.SetActive(true);çağrısını yapar.Resume(),Time.timeScale = 1f;değerini ayarlar vepanel.SetActive(false);çağrısını yapar.BallMachine.csiçindeUpdate()içindeki Space denetiminin üstüneif (Time.timeScale == 0f) return;ekle.
“Oyna” düğmesine bas, topa servis at ve duraklat: top havada asılı kalır. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using UnityEngine;
public class PauseMenu : MonoBehaviour
{
public GameObject panel;
public void Pause()
{
// Oyun zamanını durdur ve paneli göster
}
public void Resume()
{
// Oyun zamanı yeniden normal hızda, panel gizli
}
}
Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler
1Ekrandaki Metinler
Canvas ve MetinSkoru GösterSayıları BiçimlendirGeri Sayım ZamanlayıcısıTekrar: Hız Göstergesi2Düğmeler ve Ekranlar
Düğmeler ve onClickLambda İfadeleriInspector'da Bağlantı KurmaPanelleri Açma ve KapamaCan ÇubuklarıTekrar: Yükseltme Mağazası5PlayerPrefs ile Kaydetme
Bir Sayı KaydetmeVarsayılan Değerle YüklemeEn Yüksek SkorAyarları KaydetmeTekrar: Bankadaki ParalarKendi başına pratik yap: Unity playground