Menu
CoddyTech

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.

challenge icon

Görev

Orta

Kurbağa yalnızca yerden zıplasın.

  1. Physics.Raycast(transform.position, Vector3.down, 0.85f) değerini döndüren bool IsGrounded() ekle: kurbağanın yarıçapı olan 0.75'e 0.1 ekle.
  2. Update() içinde, Space tuşuna basıldığında çalışan if koş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

Kendi başına pratik yap: Unity playground