Yerçekimini Elle Uygulama
Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 39 / 60.
Bir CharacterController yalnızca betiğin onu düşürmesiyle 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üyüştekiyle 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, aşağı doğru hafif bir itişi sürdür
}
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; hızın Time.deltaTime ile çarpımı ise bu karede alınan mesafedir. Hız bir alanda tutulur, çünkü kareler arasında korunması gerekir; yerel bir değişken her karede yeniden 0'dan başlardı. Durduğu yerden 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. Zeminde Move denetleyiciyi durdurur, ancak alanı durduran hiçbir şey yoktur: sıfırlama olmadan oyuncu dururken değer artmaya devam eder ve bir çıkıntıdan sonraki adımda tam hızla düşer. Değer 0 yerine küçük bir negatif sayıya sıfırlanır; böylece her Move zemine doğru baskı yapmayı sürdürür: 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; bu nedenle bir önceki karenin Move işlemini belirtir.
Görev
OrtaDalgıca yerçekimi ekle, böylece düşüşü hızlansın.
Update()metodunun en başında,controller.isGroundeddoğruysa veverticalSpeed < 0fiseverticalSpeed = -1f;değerini ata.gravity * Time.deltaTimedeğerini buna ekle veMathf.Maxile-maxFalldeğerinde veya üzerinde tut.controller.Movesatırından öncemove.y = verticalSpeed;değerini ata.
“Oyna” düğmesine bas ve kuleden aşağı yürü: düşüş hızı saniyede 10 birime kadar çıkar. Ardından “Kontrol et” düğmesine 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üşüşü sınırla, sonucu move.y içine koy
Vector3 move = new Vector3(Input.GetAxisRaw("Horizontal"), 0f, Input.GetAxisRaw("Vertical")) * speed;
controller.Move(move * Time.deltaTime);
}
}
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östergesi2Düğ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ıplamaKendi başına pratik yap: Unity playground