Menu
CoddyTech

Kuyruk

Coddy'nin Unity'de 3D Yılan Oyunu 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
  1. using System.Collections.Generic; ve public List<Transform> tail = new List<Transform>(); ekle. Sahne, listeyi Tail1 ve Tail2 ile doldurur.
  2. Step() içinde, kafa hareket etmeden hemen önce kuyruğu hareket ettir: her parça, arkadan başlayarak, önündeki parçanın hücresine geçer ve tail[0] kafanın hücresine geçer.

Play'e bas ve yönlendir: kuyruk kafanın izlediği yolu takip eder. 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ı
    public int edge = 7;         // tahtanın hücreleri -edge ile edge arasında yer alır
    public bool alive = true;
    private float timer;
    private Vector3 direction = Vector3.right;       // başın son adımında hareket ettiği yön
    private Vector3 nextDirection = Vector3.right;   // sonraki adım için 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;
    }
}
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