Menu
CoddyTech

U Dönüşü Yok

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

Düz bir şekilde geri dönen yılan kendi boynuna çarpar; bu nedenle ters yöne yapılan 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.

Bir tuşa basılması yönü anında değiştirdiğinde direction ile karşılaştırmak yeterli olmaz: sağa doğru hareket ederken oyuncu tek bir tik içinde önce yukarı, ardından sola basar. Yukarı yönüne izin verilir, sonra sola dönüş yukarı yönüyle karşılaştırılır ve ona da izin verilir; sonraki adımda yılan boynunun üzerinden geri döner.

Bu yüzden iki yön tut: başın en son hareket ettiği yön olan direction ve sonraki adım için bekleyen dönüş olan nextDirection. Bir tuş, direction ile karşılaştırdıktan sonra nextDirection değerini değiştirir; sonraki adımda bekleyen dönüş gerçekleşir.

challenge icon

Görev

Kolay

Yılanın doğrudan boynuna doğru dönmesini engelle.

  1. private Vector3 nextDirection = Vector3.right; ve void Turn(Vector3 newDirection) ekle: newDirection == -direction olmadığı sürece nextDirection değerini ayarla.
  2. Update() içinde her tuş, direction değerini ayarlamak yerine kendi yönünü Turn işlevine iletsin.
  3. Step() işlevinin başında direction = nextDirection; ayarla.

“Oyna” düğmesine bas ve sağa doğru hareket ederken sola bas: yılan sağa doğru ilerlemeye devam eder. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // iki adım arasındaki saniye cinsinden süre
    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;
    }
}

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

Kendi başına pratik yap: Unity playground