Zıplama
Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 40 / 60.
Bir zıplama, Space tuşuna basıldığı anda yalnızca bir kez ayarlanan dikey bir hızdır; betiğin zaten eklediği yer çekimi yükselişi yavaşlatır, tepe noktasında 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 yüzden v hızında başlayan bir zıplama, 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ı olan -20 olarak saklandığında ve zıplama yüksekliği 2.5 birim olduğunda, bu değer Mathf.Sqrt(2.5f * -2f * -20f), yani 100'ün karekökü: saniyede 10 birimdir. -2f, negatif yer çekimini pozitife çevirir; çünkü negatif bir sayının karekökü NaN'dir:
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 sınar; bu yüzden yalnızca düşüşleri bitirir: zıplama satırından sonra kullanılan yalın bir if (controller.isGrounded) sıfırlaması, zıplama hızını zıplamanın gerçekleştiği karede üzerine yazar. Zıplama koşulundaki controller.isGrounded sınaması, havadayken zıplamayı engeller. Inspector'da jumpHeight veya gravity değerini değiştirsen de zıplama 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.
Görev
OrtaTek bir zıplama betiğinin hem Çocuk hem de Kanguru için çalışmasını sağlayın.
Update()içinde,9fdeğerini, tam olarakjumpHeightkadar yükselmeyi sağlayan başlangıç hızı olanMathf.Sqrt(jumpHeight * -2f * gravity)ile değiştirin.- Havada zıplamayı önlemek için zıplama
ifkoşuluna&& controller.isGroundedekleyin.
“Oyna” düğmesine basın ve Space tuşuna basın: Çocuk 1 birim, Kanguru ise 4 birim yükselir. Ardından “Kontrol et” düğmesine basın.
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);
}
}
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