Menu
CoddyTech

Büyü

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

Yemek yemek yılanın bir segment uzamasını sağlar. Yeni segment, hamleden önce kuyruğun ucunun bulunduğu yere gider: kuyruk ilerler ve yeni segment, ucun boşalttığı hücreyi doldurur; böylece yılan arkadan büyür.

Kuyruk ilerledikten sonra o hücre boşalır, bu yüzden önce onu hatırla. Ardından, kafa yemeğe ulaştığında orada bir segment örneği oluştur ve onu listeye ekle; böylece sonraki hamleden itibaren yılanı takip eder. Oluşturulan ama eklenmeyen bir segment asla hareket etmez. Bir tren de aynı şekilde arkaya bir vagon ekler:

Vector3 back = wagons[wagons.Count - 1].position;
// ... tren yoluna devam eder ...
Transform wagon = Instantiate(wagonPrefab, back, Quaternion.identity);
wagons.Add(wagon);

Eat() çağrılmadan önce büyüt. Eat() yemeği taşır ve sonraki derste, yeni segment de dâhil olmak üzere, yılanın kaplamadığı bir hücre bulması sağlanır.

challenge icon

Görev

Orta

Her yiyecek kuyruğa bir parça ekler.

  1. Snake içinde public Transform segmentPrefab; ekle (sahne bunu bağlar).
  2. Step() içinde, kuyruk hareket etmeden önce Vector3 tailEnd değerini sakla: kuyruğun boş olmadığı durumda son parçanın hücresi, kuyruk boş olduğunda ise başın hücresi.
  3. Yiyecek yendiğinde Instantiate(segmentPrefab, tailEnd, Quaternion.identity) değerini tail listesine ekle, ardından Eat() çağır.

“Oyna” düğmesine bas ve birkaç yiyecek ye: yılan her seferinde bir küp büyür. Ardından “Kontrol et” düğmesine bas.

Kendin dene

using System.Collections.Generic;
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;
    public List<Transform> tail = new List<Transform>();
    private float timer;
    private Vector3 direction = Vector3.right;       // başın son adımında 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;
        }

        for (int i = tail.Count - 1; i > 0; i--)
        {
            tail[i].position = tail[i - 1].position;
        }
        if (tail.Count > 0)
        {
            tail[0].position = transform.position;
        }
        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