Fizik için FixedUpdate
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 4 / 71.
Unity, kare hızından bağımsız olarak, cisimleri 0.02 saniyelik sabit fizik adımlarında (Time.fixedDeltaTime), saniyede 50 kez hareket ettirir. FixedUpdate() her adımdan hemen önce çalışır. Update() çizilen her karede bir kez çalışır; bu da saniyede 30, 60 veya 144 kez olabilir: 144 karede çoğu karede hiç fizik adımı olmaz, yavaş bir bilgisayarda ise tek bir karede iki adım olabilir.
Bundan iki kural çıkar. Update() içinde eklenen bir kuvvet her karede bir kez eklenir; dolayısıyla daha hızlı bir bilgisayar daha güçlü iter: zaman içinde etki eden kuvvetleri FixedUpdate() içine koy. Ayrıca GetKeyDown yalnızca bir kare boyunca true olur; o karede fizik adımı yoksa FixedUpdate() bunu hiç görmez ve tuş basışı kaybolur. Bu yüzden basışları Update() içinde oku, bir bool içinde hatırla ve bunlara FixedUpdate() içinde karşılık ver. Bu tekne sabit bir rüzgârla itilir ve tıklamayla yana doğru hızla ilerler:
private bool dashQueued;
void Update()
{
if (Input.GetMouseButtonDown(0))
{
dashQueued = true; // tıklamayı hatırla
}
}
void FixedUpdate()
{
rb.AddForce(Vector3.forward * wind); // her adımda sabit bir itiş
if (dashQueued)
{
rb.AddForce(Vector3.right * 4f, ForceMode.Impulse);
dashQueued = false; // bir tıklama, bir atılma
}
}Kullandıktan sonra bool değerini sıfırlamak önemlidir: true olarak bırakılırsa her adımda hızla ilerler. Kurbağanın zıplamasında olduğu gibi, tek bir dürtü doğrudan Update() içinden de eklenebilir; bool kullanmak tüm itişleri, birlikte çalıştıkları kuvvetlerin yanına, tek bir yerde toplar. Basılı tutulan tuşlar (GetKey, GetAxis) bir anı değil, bir durumu tanımlar; bu nedenle FixedUpdate() bunları doğrudan okuyabilir. FixedUpdate() içinde Time.deltaTime, adımın 0.02 değerini döndürür.
Görev
KolayKızağın iki görevini doğru yöntemlere yerleştir.
- İki ok tuşu
ifbloğunuUpdate()içindenFixedUpdate()içine taşı. private bool hopPressed;ekle.Update()içinde,Input.GetKeyDown(KeyCode.Space)gerçekleştiğinde bunutrueolarak ayarla.FixedUpdate()içinde,hopPressedayarlanmışsa itme kuvvetini uygula, ardından bunufalseolarak ayarla.
“Oyna” düğmesine bas: ok tuşları eşit şekilde iter ve her Space basışında zıplar. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using UnityEngine;
public class Sled : MonoBehaviour
{
public float push = 6f;
public float hop = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKey(KeyCode.RightArrow))
{
rb.AddForce(Vector3.right * push);
}
if (Input.GetKey(KeyCode.LeftArrow))
{
rb.AddForce(Vector3.left * push);
}
}
void FixedUpdate()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * hop, ForceMode.Impulse);
}
}
}
Fizik ve Oynanış bölümündeki tüm dersler
1Rigidbody
Yerçekimi ve KütleAddForce ile İtmeDürtüyle ZıplamaFizik için FixedUpdateHızKinematik CisimlerTekrar: Fırlatma Rampası2Çarpışmalar
OnCollisionEnterNeye Çarptım?Çarpınca KırılYerde DurmakSekme ve SürtünmeCollider ŞekilleriTekrar: Kırılabilir DuvarKendi başına pratik yap: Unity playground