Menu
CoddyTech

Zıplama

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 39 / 56.

Bir sıçrama, Space tuşuna basıldığı anda bir kez ayarlanan dikey hızdır; betiğin zaten eklediği yer çekimi yükselişi yavaşlatır, en üst noktada durdurur ve denetleyiciyi tekrar aşağı indirir. Geriye, belirli bir yüksekliğe ulaşmak için gereken başlangıç hızı kalır. Yer çekimi hızı sabit bir oranda azaltır; bu nedenle v hızıyla başlayan bir sıçrama, durmadan önce v * v / (2 * g) birim yükselir. Tersinden hesaplandığında, h yüksekliği için başlangıç hızı v = √(2 * g * h) olur.

gravity negatif bir sayı olarak, -20 değerinde saklandığında ve sıçrama 2.5 birim yüksekliğinde olduğunda, bu işlem Mathf.Sqrt(2.5f * -2f * -20f) olur; yani 100'ün karekökü: saniyede 10 birim. Negatif bir sayının karekökü NaN olduğundan, -2f negatif yer çekimini pozitife çevirir:

if (controller.isGrounded && verticalSpeed < 0f)
{
    verticalSpeed = -2f;
}
if (Input.GetButtonDown("Jump") && controller.isGrounded)
{
    verticalSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
verticalSpeed += gravity * Time.deltaTime;

Sıfırlama işlemi verticalSpeed < 0f koşulunu test eder; bu nedenle yalnızca düşüşleri sonlandırır: sıçrama satırından sonra kullanılan yalın bir if (controller.isGrounded) sıfırlaması, sıçrama hızını sıçrama karesinde üzerine yazar. Sıçrama koşulundaki controller.isGrounded testi, havadayken sıçramayı engeller. Denetleyicide jumpHeight veya gravity değerini değiştirin; sıçrama yine tam olarak jumpHeight yüksekliğine ulaşır. Buna karşılık verticalSpeed = 8f gibi sabit bir hız, her yer çekimi değerinde farklı bir yüksekliğe ulaşır.

challenge icon

Görev

Orta

İki zıplayıcı aynı Jumper.cs dosyasını çalıştırıyor: Inspector'da gravity değeri -18 ve jumpHeight değeri 1 olarak ayarlanan Kid ile gravity değeri -8 ve jumpHeight değeri 4 olan Kangaroo. Space, deneme yanılmayla bulunan 9 sayısına verticalSpeed değerini ayarlıyor: bu değer iki zıplayıcıdan da hiçbirine uymuyor ve havadayken de çalışıyor. Zıplamayı düzelt:

  • Space, her zıplayıcının kendi jumpHeight ve gravity değerlerinden hesaplanan, tam olarak jumpHeight kadar yükselen bir zıplama başlatır.
  • Yalnızca yerde olan bir zıplayıcı zıplayabilir.

Play'e basıp zıpla, ardından Check'e bas.

Kendin dene

using UnityEngine;

public class Jumper : MonoBehaviour
{
    public float speed = 5f;
    public float gravity = -18f;
    public float jumpHeight = 1f;

    CharacterController controller;
    float verticalSpeed;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        if (controller.isGrounded && verticalSpeed < 0f)
        {
            verticalSpeed = -2f;
        }
        if (Input.GetButtonDown("Jump"))
        {
            verticalSpeed = 9f;
        }
        verticalSpeed += gravity * Time.deltaTime;

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        move.y = verticalSpeed;
        controller.Move(move * Time.deltaTime);
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler