Zıpla
Coddy'nin Unity Oyunu: Gökyüzü Şeritleri kursunda ders 3 / 20.
Sırada koşucu zıplıyor. CharacterController'ın kendi yer çekimi yoktur: betiğiniz dikey bir hızı saklar ve her karede bu hız kadar hareket eder.
Yer çekimi bu hızı her karede değiştirir. Koşucu yerde durduğunda (controller.isGrounded), yola basılı kalması için küçük bir aşağı yönlü hızı -2 olarak tutun:
if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
fallSpeed += gravity * Time.deltaTime;Yer çekimi g iken h yüksekliğine ulaşmak için zıplama Mathf.Sqrt(h * -2f * g) hızıyla başlar. Zıplama yüksekliği 1.6 ve güçlü yer çekimi -40 olduğunda koşucu yükseğe zıplar ve hızla aşağı iner; bu da nesnelerin üzerinize geldiği bir oyuna uygundur:
bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
if (jump && controller.isGrounded)
{
fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}Hareketin artık bir y bileşeni de var: fallSpeed * Time.deltaTime.
Görev
Kolaypublic float jumpHeight = 1.6f;,public float gravity = -40f;veprivate float fallSpeed;satırlarınıRunnersınıfına ekle.- Şerit tuşlarından sonra zıplama tuşlarını (W, Up, Space) oku ve yalnızca
controller.isGroundeddoğru olduğunda zıpla. targetXsatırından önce yukarıdaki iki yerçekimi satırını ekle.- Hareket değerini
new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f)olarak ayarla.
Kendin dene
using UnityEngine;
public class Runner : MonoBehaviour
{
public float laneWidth = 2.5f;
public float laneSpeed = 16f;
public int lane;
private CharacterController controller;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
float targetX = lane * laneWidth;
float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
Vector3 move = new Vector3(x - transform.position.x, 0f, 0f);
controller.Move(move);
}
}
Unity Oyunu: Gökyüzü Şeritleri bölümündeki tüm dersler
Kendi başına pratik yap: Unity playground