Işınla Zemin Kontrolü
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 37 / 71.
Bir zıplama yalnızca yerdeyken başlamalıdır. Yerde Durma, çarpışma mesajlarıyla güncel tutulan temas normallerinden bunu belirliyordu. Bir ışın, o anda “bir şeyin üzerinde miyim?” sorusunu yanıtlar: Işını merkezden dümdüz aşağıya, merkezden tabana olan mesafeden biraz daha uzun olacak şekilde gönder. Bu oyuncu 2 birim boyunda bir kapsüldür; dolayısıyla tabanı merkezinin 1 birim altındadır ve ışının uzunluğu 1.1’dir:
public float jumpForce = 5f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space) && IsGrounded())
{
rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
}
}
bool IsGrounded()
{
return Physics.Raycast(transform.position, Vector3.down, 1.1f);
}Eklenen 0.1 bir paydır. Yerde duran bir cisim, zeminin biraz üzerinde kalabilir veya zeminin biraz içine gömülebilir; bu nedenle tam 1 birim uzunluğundaki bir ışın bazı karelerde hedefi ıskalar. Çok daha uzun olması da diğer yönden yanlıştır: 3 birimle oyuncu havada 2 birim yükselmişken yeniden zıplayabilir; uzunluğu hiç olmayan bir ışın ise zemini her zaman bulur, bu yüzden her basışta zıplanır.
Işın, ışınların atladığı oyuncunun kendi çarpıştırıcısının içinden başlar; dolayısıyla oyuncuyu hiçbir zaman algılamaz. Tuş Update() içinde okunur, çünkü GetKeyDown yalnızca bir kare boyunca true olur ve Jump with an Impulse örneğinde olduğu gibi tek seferlik bir dürtü tam o anda uygulanabilir.
Görev
OrtaKurbağa yalnızca yerden zıplasın.
Physics.Raycast(transform.position, Vector3.down, 0.85f)değerini döndürenbool IsGrounded()ekle: kurbağanın yarıçapı olan 0.75'e 0.1 ekle.Update()içinde, Space tuşuna basıldığında çalışanifkoşuluna&& IsGrounded()ekle.
“Oyna” düğmesine bas ve Space tuşuna iki kez bas: kurbağa bir kez zıplar. Ardından “Kontrol et” düğmesine bas.
Kendin dene
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float jumpForce = 6f;
private Rigidbody rb;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
rb.AddForce(Vector3.up * jumpForce, 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