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; // trueBir 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.
Görev
Kolayprivate Vector3 nextDirection = Vector3.right;ekle; bu, sonraki adım için bekleyen dönüşü belirtir.void Turn(Vector3 newDirection)yaz:newDirection,directiondeğerinin tersi olmadığı sürecenextDirectiondeğerininewDirectionolarak ayarlar.Update()içinde her tuş,directiondeğerini ayarlamak yerine kendi yönüyleTurnçağırır.Step()başlangıcındadirectiondeğerininextDirectionolarak 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;
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.