Menu
CoddyTech

U Dönüşü Yasak

Coddy'nin Unity'de 3D Yılan Oyunu kursunda ders 3 / 14.

Dümdüz geriye dönen bir yılan kendi boynuna çarpar; bu yüzden gittiği yönün tersine yapılan bir dönüş yok sayılır. Bir yönün tersi, onun negatifidir: yılan sağa doğru hareket ederken -direction, Vector3.left olur.

Vector3 heading = Vector3.right;
Vector3 back = -heading;            // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back;   // true

Bir tuşa basıldığında direction hemen değiştiği için yalnızca direction ile karşılaştırmak yeterli değildir. Sağa doğru hareket ederken oyuncu tek bir tik içinde önce yukarı, sonra sola basar. Yukarı yönüne dönmeye izin verilir. Ardından sol, henüz gerçekleşmemiş dönüş olan yukarıya göre kontrol edilir ve ona da izin verilir; böylece sonraki adımda sola gidilir ve yılan boynunun üzerinden dümdüz geriye döner.

Çözüm, iki yön tutmaktır. direction, başın son adımında hareket ettiği yöndür; nextDirection ise sonraki adımı bekleyen dönüşü belirtir. Bir tuşa basılması nextDirection değerini değiştirir, ancak yalnızca dönüş direction ile karşılaştırıldıktan sonra; adım da bekleyen dönüşü uygulayarak başlar. Yukarıdaki örnekte sol, başın gerçekte hareket ettiği yön olan sağ ile karşılaştırılır ve yok sayılır.

challenge icon

Görev

Kolay
  1. private Vector3 nextDirection = Vector3.right; ekle; bu, sonraki adım için bekleyen dönüşü belirtir.
  2. void Turn(Vector3 newDirection) yaz: newDirection, direction değerinin tersi olmadığı sürece nextDirection değerini newDirection olarak ayarlar.
  3. Update() içinde her tuş, direction değerini ayarlamak yerine kendi yönüyle Turn çağırır.
  4. Step() başlangıcında direction değerini nextDirection olarak ayarla.

Play'e bas ve geri dönmeye çalış, ardından Check'e bas.

Kendin dene

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // iki adım arasındaki saniye sayısı
    private float timer;
    private Vector3 direction = Vector3.right;

    void Update()
    {
        Keyboard keyboard = Keyboard.current;
        if (keyboard != null)
        {
            if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) direction = Vector3.forward;
            if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) direction = Vector3.back;
            if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) direction = Vector3.left;
            if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) direction = Vector3.right;
        }

        timer += Time.deltaTime;
        if (timer >= tick)
        {
            timer -= tick;
            Step();
        }
    }

    void Step()
    {
        transform.position += direction;
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

Unity'de 3D Yılan Oyunu bölümündeki tüm dersler