Menu
CoddyTech

Parkur

Coddy'nin Unity Journey'sinin Gerçek Oyunlar Geliştirmek bölümünün bir parçası. Ders 48 / 56.

Bu bölümde bir 3D platform oyunu yapılıyor. Yüzen platformların üzerinde koşup zıplıyor, süzülen bir platforma biniyor, düşmenin seni başlangıca geri göndermemesi için kontrol noktalarına dokunuyor, ekranda sayılan mücevherleri topluyor, bitiş çizgisini geçerek sonraki seviyeye ilerliyor ve en iyi süreni geçmeye çalışıyorsun. Oyun, en başından beri projede bulunan beş betikten oluşuyor: Player, MovingPlatform, Checkpoint, Gem ve FinishLine. Son dört betik şimdilik boş ve her ders bunlardan birini dolduruyor. Oyuncu, Input System'in eylemleriyle yönlendirilen bir CharacterController'dır; kamera da onun alt öğesi olduğundan bir betik olmadan takip eder.

Bir CharacterController iki şekilde hareket eder. Move(motion) onu bir mesafe kadar hareket ettirir ve başka bir şey eklemez; bu nedenle yer çekimi, zıplamalar ve Time.deltaTime betiğin sorumluluğundadır; Character Controller bölümünde olduğu gibi. SimpleMove(speed) saniyedeki birim cinsinden bir hız alır, bunu kare süresiyle kendisi çarpar ve yer çekimini ekler; ilettiğin y değerini yok sayar. Bu nedenle onunla hareket ettirilen bir karakter çıkıntılardan düşer ama asla zıplayamaz. Yukarıdan görülen bir çoban köpeği oyunundaki bu koyun köpeğinin zıplaması gerekmez; bu yüzden SimpleMove ve Move eylemi, betiğinin tamamıdır:

using UnityEngine;
using UnityEngine.InputSystem;

public class Sheepdog : MonoBehaviour
{
    [SerializeField] private float speed = 6f;
    private CharacterController controller;
    private InputAction moveAction;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        moveAction = InputSystem.actions.FindAction("Move");
    }

    void Update()
    {
        Vector2 input = moveAction.ReadValue<Vector2>();
        controller.SimpleMove(new Vector3(input.x, 0f, input.y) * speed);
    }
}

Platform oyununun oyuncusunun zıplaması gerektiğinden kendi dikey hızını tutar ve Input sınıfı yerine Move ve Jump eylemlerini okuyarak Move ile hareket eder. Unity, kare başına bir kez Move veya SimpleMove çağrılmasını önerir: yürüme ve düşme aynı çağrıya girer ve ardından isGrounded bu hareketin tamamını tanımlar.

challenge icon

Görev

Orta

Platform oyununa oyuncuyla başla. Player betiğinde speed (5), jumpHeight (1.5) ve gravity (-9.81), controller ve düşüş için bir velocity bulunur. Move ve Jump eylemlerini bir kez, Start içinde bul; ardından Update içinde:

  • Move, oyuncuyu saniyede speed birim hızla yürütür: x ekseninde sağa ve sola, z ekseninde ileri ve geri.
  • Yer çekimi, her karede gravity * Time.deltaTime değerini velocity.y değerine ekler. Denetleyici yerdeyken ve velocity.y 0'ın altındayken, yere basılı kalması için önce velocity.y değerini -2 yap.
  • Yerdeyken Jump'a her basıldığında velocity.y değeri Mathf.Sqrt(jumpHeight * -2f * gravity) olarak ayarlanır: jumpHeight birim yüksekliğinde bir zıplama. Jump'ı basılı tutmak yalnızca bir kez zıplatır ve havadayken zıplanamaz.
  • Yürüme hareketiyle velocity değerini birleştirip Time.deltaTime ile çarparak controller.Move işlevini bir kez çağır.

Play'e basıp ilk platformlara doğru zıpla, ardından Check'e bas.

Kendin dene

using UnityEngine;
using UnityEngine.InputSystem;

public class Player : MonoBehaviour
{
    [SerializeField] private float speed = 5f;
    [SerializeField] private float jumpHeight = 1.5f;
    [SerializeField] private float gravity = -9.81f;

    private CharacterController controller;
    private Vector3 velocity;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        // Move eylemiyle yürü, Jump eylemiyle zıpla, yerçekimiyle düş
    }
}
quiz iconKendini test et

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