Menu
CoddyTech

Ağır Çekim

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

0 ile 1 arasındaki bir Time.timeScale değeri ağır çekimdir. 0.25 değerinde Time.deltaTime, gerçek kare süresinin dörtte biridir; bu nedenle speed * Time.deltaTime ile hareket ettirilen bir araba, her gerçek saniyede mesafenin dörtte birini kat eder, Rigidbody'ler hızlarının dörtte biriyle uçar ve düşer, WaitForSeconds(1f) ise gerçek zamanda 4 saniye sürer. 1'in üzerinde oyun hızlanır: 2, iki kat hız demektir.

Fizik için bir satır daha gerekir. Her fizik adımı oyunu hâlâ Time.fixedDeltaTime kadar, yani oyun zamanında 0.02 saniye ilerletir ve 0.25 değerinde bu adımlar gerçek zamanda 0.08 saniye sürer: FixedUpdate() gerçek saniyede yalnızca 12.5 kez çalışır; bu nedenle cisimler beş karede bir hareket eder ve takılır. Adım süresini aynı oranda küçült ve sonrasında her iki değeri de eski hâline getir; çünkü Unity fixedDeltaTime değerini kendi başına hiçbir zaman sıfırlamaz. Bu betik, Space tuşuna basılı tutulurken oyunu yavaşlatır:

float normalStep;

void Awake()
{
    normalStep = Time.fixedDeltaTime;   // Yeni bir projede 0.02
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Time.timeScale = 0.25f;
        Time.fixedDeltaTime = normalStep * Time.timeScale;
    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        Time.timeScale = 1f;
        Time.fixedDeltaTime = normalStep;
    }
}

Daha küçük adımla fizik, gerçek saniyede 50 kez işlemeye devam eder ve her adım oyun zamanının dörtte birini kapsar; böylece ağır çekim akıcı kalır. Adım süresi oyun saniyesi cinsindendir; bu nedenle Time.deltaTime kullanan FixedUpdate() içindeki kod değişmeden çalışmaya devam eder.

challenge icon

Görev

Orta

💬Kuyruklu yıldızın SlowZone içindeki uçuşunu ağır çekimde oynat.

  1. SlowZone.cs içinde void OnTriggerEnter(Collider other) yaz: Time.timeScale değerini slowScale olarak, Time.fixedDeltaTime değerini ise 0.02f * slowScale olarak ayarla.
  2. void OnTriggerExit(Collider other) yaz: bunları tekrar 1f ve 0.02f olarak ayarla.

“Oyna” düğmesine bas ve Space tuşuna bas: kuyruklu yıldız bölgeden 0.4 hızla süzülür. Ardından “Kontrol et”.

Kendin dene

using UnityEngine;

public class SlowZone : MonoBehaviour
{
    public float slowScale = 0.4f;

    // Bölgenin içinde bir şey varken ağır çekim
}

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

Kendi başına pratik yap: Unity playground