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, BenBaş, tail[0] eski hücresine geçtikten sonra en son hareket eder.
Görev
Ortausing System.Collections.Generic;vepublic List<Transform> tail = new List<Transform>();ekle. Sahne, listeyi Tail1 ve Tail2 ile doldurur.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 vetail[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;
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.