Yerde Durmak
Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 11 / 63.
Her temasın bir normal vektörü vardır: uzunluğu 1 olan, dokunduğun yüzeye dik ve o yüzeyden nesnene doğru yönelen bir vektör. collision.GetContact(0) ilk temas noktasıdır ve normal hangi tarafa dokunduğunu belirtir. Düz zeminde dururken bu değer (0, 1, 0); sağındaki bir duvara yaslandığında (-1, 0, 0); başını tavana çarptığında ise (0, -1, 0) olur.
Bu kod, yere inişleri yandan çarpmalardan ayırır:
void OnCollisionEnter(Collision collision)
{
Vector3 normal = collision.GetContact(0).normal;
if (normal.y > 0.5f)
{
Debug.Log("Landed on " + collision.gameObject.name);
}
else
{
Debug.Log("Bumped the side of " + collision.gameObject.name);
}
}Testte tam olarak 1 değeri yerine normal.y > 0.5f koşulu kullanılır; böylece eğimler de zemin sayılır: 60 derecelik bir eğimde y değeri 0.5'tir ve bu, herhangi birinin yürüyebileceğinden daha dik bir eğimdir. Daha uzun süren temaslar için iki mesaj daha kullanabilirsin: Temas devam ettiği sürece her fizik adımında OnCollisionStay çalışır; temas sona erdiğinde ise bir kez OnCollisionExit çalışır. Artık hiçbir şey temas etmediğinden, çıkışta temas noktası bulunmaz; bu nedenle orada GetContact çağırma.
Görev
KolayOyuncu yürüyebilir ve zıplayabilir, ancak Boşluk tuşu havadayken de çalıştığı için her seferinde bir zıplayışla göğe tırmanabilir ve duvarın yanından atlayabilir. (Çarpıştırıcısının sürtünmesiz bir malzemesi vardır, bu yüzden duvarlara yapışmak yerine aşağı kayar.) Yalnızca bir şeyin üzerinde dururken zıplamasını sağlayın.
- Bir
bool groundedtutun: oyuncu temas normali yukarıyı gösteren (y değeri 0.5'in üzerinde) bir şeye dokunurken true, dokunmayı bıraktığında false olsun. - Yalnızca Boşluk tuşuna basılmışsa ve
groundedtrue ise zıplayın. Havada basılan tuş yok sayılır; yere inene kadar kaydedilmez.
Play'e basın, iki kez zıplamayı ve duvara tırmanmayı deneyin, ardından Check'e basın.
Kendin dene
using UnityEngine;
public class Hopper : MonoBehaviour
{
public float speed = 4f;
public float jump = 6f;
private Rigidbody rb;
private bool jumpPressed;
void Start()
{
rb = GetComponent<Rigidbody>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
jumpPressed = true;
}
}
void FixedUpdate()
{
float h = Input.GetAxisRaw("Horizontal");
rb.linearVelocity = new Vector3(h * speed, rb.linearVelocity.y, 0);
if (jumpPressed)
{
rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
jumpPressed = false;
}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.
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 Duvar