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.
Görev
OrtaDalgıç 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, saniyedegravitykadar 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
maxFallbirimden daha hızlı düşmez. - Denetleyici zemindeyken ve
verticalSpeed0'ın altındaysa,verticalSpeeddeğ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);
}
}
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
1Ekrandaki Metinler
Canvas ve MetinSkoru GösterSayıları BiçimlendirGeri Sayım ZamanlayıcısıTekrar: Hız Göstergesi4Sahneler ve Bölümler
Bir Sahne YüklemeBölümü Yeniden BaşlatmaSonraki BölümSahneler Arasında SaklamaTekrar: Bölüm Seçimi10Proje: 3D Platform Oyunu
ParkurHareketli Platformlar2Düğmeler ve Ekranlar
Düğmeler ve onClickLambda İfadeleriInspector'da Bağlantı KurmaPanelleri Açma ve KapamaCan ÇubuklarıTekrar: Yükseltme Mağazası5PlayerPrefs ile Kaydetme
Bir Sayı KaydetmeVarsayılan Değerle YüklemeEn Yüksek SkorAyarları KaydetmeTekrar: Bankadaki Paralar8Karakter Kontrolcüsü
CharacterController.MoveYerçekimini Elle UygulamaZıplamaNesneleri İtmeBaktığın Yöne Hareket EtTekrar: Çift Zıplama