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.
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
jumpHeightvegravitydeğerlerinden hesaplanan, tam olarakjumpHeightkadar 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);
}
}
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