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.
Görev
Orta💬Kuyruklu yıldızın SlowZone içindeki uçuşunu ağır çekimde oynat.
SlowZone.csiçindevoid OnTriggerEnter(Collider other)yaz:Time.timeScaledeğerinislowScaleolarak,Time.fixedDeltaTimedeğerini ise0.02f * slowScaleolarak ayarla.void OnTriggerExit(Collider other)yaz: bunları tekrar1fve0.02folarak 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
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