Menu
CoddyTech

Kuyruk

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

Kuyruk, başın hemen arkasındaki tail[0] öğesinden sona kadar uzanan bir segment listesidir: List<Transform> tail. Sahne, Inspector'da ayarlanan Tail1 ve Tail2 olmak üzere iki segmentle yılanı başlatır.

Her adımda her segment, önündeki segmentin hücresine geçer ve tail[0], başın hücresine geçer. Sıra önemlidir. Önden gidildiğinde tail[1], tail[0]'ın zaten geçtiği hücreyi kopyalar ve kuyruğun tamamı tek bir hücrede üst üste yığılır. Arkadan gidildiğinde ise her segment henüz değişmemiş bir hücreyi kopyalar. Bir koltuk geriye kayan yolcular da aynı şekilde hareket eder:

string[] seats = { "Ana", "Ben", "Cy" };
for (int i = seats.Length - 1; i > 0; i--)
{
    seats[i] = seats[i - 1];
}
seats[0] = "Dee";   // Dee, Ana, Ben

Baş, tail[0] eski hücresine geçtikten sonra en son hareket eder.

challenge icon

Görev

Orta

Yılanın başını takip eden bir kuyruğu olsun.

  1. Snake içinde using System.Collections.Generic; ve public List<Transform> tail = new List<Transform>(); ekle (sahne Tail1 ve Tail2'yi ekler).
  2. Step() içinde, baş hareket etmeden hemen önce: arkadan başlayarak her parça, önündeki parçanın bulunduğu hücreye geçer; tail[0] başın bulunduğu hücreye geçer.

“Oyna” düğmesine bas ve yön ver: kuyruk, başın izlediği yolu takip 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
    public int edge = 7;         // tahtanın hücreleri -edge ile edge arasında uzanır
    public bool alive = true;
    private float timer;
    private Vector3 direction = Vector3.right;       // başın son adımda hareket ettiği yön
    private Vector3 nextDirection = Vector3.right;   // bir sonraki adımı bekleyen dönüş

    void Update()
    {
        if (!alive) return;

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

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

    void Turn(Vector3 newDirection)
    {
        if (newDirection != -direction)
        {
            nextDirection = newDirection;
        }
    }

    void Step()
    {
        direction = nextDirection;
        Vector3 next = transform.position + direction;
        if (Mathf.Abs(next.x) > edge || Mathf.Abs(next.z) > edge)
        {
            Die();
            return;
        }

        transform.position = next;

        if (GameManager.Instance.IsFood(next))
        {
            GameManager.Instance.Eat();
        }
    }

    void Die()
    {
        alive = false;
    }
}

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

Kendi başına pratik yap: Unity playground