Menu
CoddyTech

Işınla Zemin Kontrolü

Coddy'nin Unity Journey'sinin Fizik ve Oynanış bölümünün bir parçası. Ders 35 / 63.

Bir zıplama yalnızca yerdeyken başlamalıdır. Standing on the Ground, bunu çarpışma mesajlarıyla güncel tutulan temas normallerinden hesaplıyordu. Bir ışın, “bir şeyin üzerinde duruyor muyum?” sorusunu o anda, herhangi bir zamanda yanıtlar: merkezden dümdüz aşağı doğru, merkez ile alt kısım arasındaki mesafeden biraz daha uzun olacak şekilde ışın gönder. Bu oyuncu 2 birim boyunda bir kapsüldür; dolayısıyla alt kısmı 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);
}

Ekstra 0.1, bir pay bırakır. Zeminde duran bir cisim zeminin biraz üzerinde kalabilir veya biraz içine gömülebilir; bu yüzden tam 1 uzunluğundaki bir ışın bazı karelerde hedefi bulamaz. Çok daha uzun olması da ters yönde yanlıştır: 3 olduğunda oyuncu havada 2 birim yükselmişken yeniden zıplayabilir; hiç uzunluğu olmadığında ise ışın her zaman zemini bulur ve her basış bir zıplama olur.

Işın oyuncunun kendi çarpıştırıcısının içinden başlar; ışınlar kendi çarpıştırıcılarını atladığı için oyuncuyu hiçbir zaman bildirmez. 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 itki tam o noktada eklenebilir.

challenge icon

Görev

Orta

Kurbağa, havadayken bile Boşluk tuşuna her basıldığında zıplıyor; bu yüzden gökyüzüne kadar tırmanabiliyor. Hopper sınıfını, yalnızca yerdeyken zıplayacak şekilde düzelt:

  • Kurbağanın merkezinden dümdüz aşağıya bir ışın gönderen bool IsGrounded() metodunu ekle. Kurbağa, ölçeği 1.5 olan bir küredir; dolayısıyla yarıçapı 0.75'tir: ışının, kurbağanın alt noktasından 0.1 daha ileriye ulaşmasını sağla.
  • Yalnızca Boşluk tuşuna basıldığında ve IsGrounded() true olduğunda zıpla.

Oynat'a bas ve iki kez zıplamayı dene, ardından Kontrol Et'e 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);
        }
    }
}
quiz iconKendini test et

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