Menu
CoddyTech

Parkur

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

Bu bölümde bir 3B platform oyunu geliştireceğiz. Koşup zıplayarak havada duran platformları geçecek, süzülen bir platforma binecek, düşüşün seni başlangıca göndermemesi için kontrol noktalarına dokunacak, ekranda sayılan mücevherleri toplayacak, bitiş çizgisini geçerek sonraki seviyeye ulaşacak ve en iyi zamanını geçmeye çalışacaksın. Oyun, projenin en başından beri mevcut olan beş betikten oluşuyor: Player, MovingPlatform, Checkpoint, Gem ve FinishLine. Son dört betik şimdilik boş ve her derste bunlardan biri dolduruluyor. Oyuncu, Input System eylemleriyle yönlendirilen bir CharacterController'dır ve kamera onun alt öğesidir; bu sayede betik olmadan oyuncuyu takip eder.

CharacterController iki şekilde hareket eder. Move(motion) onu belirli bir mesafe hareket ettirir ve başka bir şey eklemez; bu nedenle Character Controller bölümündeki gibi yer çekimi, zıplamalar ve Time.deltaTime betiğin sorumluluğundadır. SimpleMove(speed) saniye başına birim cinsinden hız alır, bunu kare süresiyle kendisi ölçeklendirir ve yer çekimini ekler; verdiğin y değerini yok sayar. Bu yüzden onunla hareket ettirilen bir karakter çıkıntılardan düşebilir ama asla zıplayamaz. Yukarıdan görülen bir çoban köpeği oyununda bu çoban köpeğinin zıplaması gerekmediğinden, SimpleMove ve Move eylemi betiğin tamamını oluşturur:

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ı korur ve Move ile hareket eder; Input sınıfı yerine Move ve Jump eylemlerini okur. Unity, kare başına bir kez Move veya SimpleMove çağrılmasını önerir: yürüme ve düşme aynı çağrıya eklenir ve ardından isGrounded bu hareketin tamamını tanımlar.

challenge icon

Görev

Orta

Oyuncunun yürümesini, zıplamasını ve düşmesini sağla.

  1. Start() içinde, InputSystem.actions.FindAction ile Move ve Jump eylemlerini bul.
  2. Update() içinde, speed hızında yürü: Move'un x değerini x ekseninde, y değerini z ekseninde kullan.
  3. Yerdeyken ve düşerken velocity.y değerine gravity * Time.deltaTime ekle ve değerini -2f yap. Yerdeyken zıplama, bu değeri Mathf.Sqrt(jumpHeight * -2f * gravity) olarak ayarlar.
  4. controller.Move((move + velocity) * Time.deltaTime) çağrısını bir kez yap.

“Oyna” düğmesine bas: ilk platforma zıpla. Ardından “Kontrol et” düğmesine 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üş
    }
}

Gerçek Oyunlar Geliştirmek bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground