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, BenBaş, tail[0] eski hücresine geçtikten sonra en son hareket eder.
Görev
OrtaYılanın başını takip eden bir kuyruğu olsun.
Snakeiçindeusing System.Collections.Generic;vepublic List<Transform> tail = new List<Transform>();ekle (sahne Tail1 ve Tail2'yi ekler).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