Menu
CoddyTech

Ölçeklenmemiş Zaman

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 35 / 56.

Duraklatılmış veya yavaşlatılmış bir oyun, bazı şeyler için yine de gerçek bir saate ihtiyaç duyar: animasyonlu bir duraklatma menüsü, oyun devam etmeden önce bir geri sayım, kendi kendine sona ermesi gereken bir dondurma. Time.unscaledDeltaTime, Time.timeScale ne olursa olsun son kareden bu yana geçen gerçek zamandır ve Time.unscaledTime oyunun başlamasından bu yana geçen gerçek zamandır. Bu duraklatma menüsü yükleme çarkını gerçek zamanla döndürür; böylece oyun duraklatıldığında da çark dönmeye devam eder:

void Update()
{
    wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime);   // Duraklatılmış olsun ya da olmasın, saniyede yarım tur
}

Coroutine'lerde de aynı ikili bulunur. WaitForSeconds oyun zamanını sayar; bu nedenle Time.timeScale = 0 olduğunda hiç bitmez; WaitForSecondsRealtime ise gerçek saniyeleri sayar. Menü açıldığında başlatılan bu coroutine, menünün başlığını her yarım saniyede bir yanıp söndürür:

IEnumerator Blink()
{
    while (true)
    {
        title.SetActive(!title.activeSelf);
        yield return new WaitForSecondsRealtime(0.5f);
    }
}

Oyun durduğunda durması gereken oyun mekaniği için ölçeklenmiş değerleri; duraklatıldığında veya yavaşlatıldığında çalışması gerekenler içinse ölçeklenmemiş değerleri kullan: menüler, animasyonları ve duraklatmayı sona erdiren sayaçlar. Invoke için gerçek zamanlı bir sürüm yoktur: her zaman oyun zamanını sayar.

challenge icon

Görev

Orta

Bir vuruş durması, güçlü bir darbeyi ağır hissettirir: çarpma anında tüm oyun kısa bir süre donar. Ok tuşları düşürücüyü hareket ettirir ve Space, ondan bir örs düşürür (Dropper.cs hazır). Her örsün taşıdığı Anvil.cs dosyasını yaz:

  • Örs herhangi bir şeye çarptığında oyunu dondur: Time.timeScale değerini 0 yap.
  • freezeTime gerçek saniye sonra (Inspector'da 0.3), değeri tekrar 1 yap.

Play'e bas, birkaç örs düşür, ardından Check'e bas.

Kendin dene

using System.Collections;
using UnityEngine;

public class Anvil : MonoBehaviour
{
    public float freezeTime = 0.3f;

    // Örs bir şeye çarptığında oyunu freezeTime gerçek saniye boyunca dondur
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler