Menu
CoddyTech

Yerçekimini Elle Uygulama

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

Bir CharacterController yalnızca betiğiniz düşmesini sağlarsa düşer ve gerçek bir düşüşte hız artar: yer çekimi, düşme hızına her saniye yaklaşık 9.81 birim ekler. Bu yüzden betik, dikey hızı bir alanda tutar, her karede buna gravity * Time.deltaTime ekler ve yürüme hareketiyle aynı Move içinde bu hız kadar hareket eder:

public float gravity = -9.81f;
float verticalSpeed;

void Update()
{
    if (controller.isGrounded && verticalSpeed < 0f)
    {
        verticalSpeed = -2f;   // yerdeyken: düşüşü durdur, hafifçe aşağı doğru itmeye devam et
    }
    verticalSpeed += gravity * Time.deltaTime;

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

Time.deltaTime iki farklı iş için iki kez kullanılır: gravity * Time.deltaTime bu karede kazanılan hızdır ve hızın Time.deltaTime ile çarpımı bu karede alınan mesafedir. Hız bir alandadır, çünkü kareler arasında korunması gerekir; yerel bir değişken her karede yeniden 0'dan başlardı. Durgun hâlden düşerken, yarım saniye sonra denetleyicinin hızı saniyede -4.9 birim, bir saniye sonra ise -9.81 birim olur.

Sıfırlama, düşüş kadar önemlidir. Yerdeyken Move denetleyiciyi durdurur, ancak alanı durduran hiçbir şey yoktur: sıfırlama olmadan, oyuncu dururken değer artmaya devam eder ve çıkıntıdan atılan bir sonraki adım tam hızla düşmesine neden olur. Değer 0 yerine küçük bir negatif sayıya sıfırlanır; böylece her Move yere doğru itmeye devam eder: yüksek kare hızında, tek bir karenin yer çekimi itişi Min Move Distance değerinden kısa olabilir, Move hiçbir şey yapmaz ve isGrounded false olur. isGrounded, Move'dan önce okunur; dolayısıyla bir önceki karenin Move işlemini belirtir.

challenge icon

Görev

Orta

Dalgıç yüksek bir kulede duruyor ve ok tuşlarıyla hareket ediyor (bu kısım zaten yazılmış). Diver.cs dosyasına yerçekimi ekle. Inspector'da gravity (-12) ve maxFall (10) değerlerini ayarla; betikte verticalSpeed alanı bulunuyor.

  • Her karede verticalSpeed, saniyede gravity kadar artar ve dalgıç, yürüyüş hareketiyle aynı Move çağrısında bu değer kadar aşağı hareket eder.
  • Hava direnci uzun düşüşleri yavaşlatır: dalgıç saniyede maxFall birimden daha hızlı düşmez.
  • Denetleyici zemindeyken ve verticalSpeed 0'ın altındaysa, verticalSpeed değerini -1 yap.

Play'e bas, kuleden aşağı yürü ve ardından Check'e bas.

Kendin dene

using UnityEngine;

public class Diver : MonoBehaviour
{
    public float speed = 4f;
    public float gravity = -12f;
    public float maxFall = 10f;

    CharacterController controller;
    float verticalSpeed;

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

    void Update()
    {
        // Yer çekimi: yerdeyken verticalSpeed değerini sıfırla, yer çekimini ekle, düşüş hızını sınırla, sonucu move.y içine ata

        Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
        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