Büyü
Coddy'nin Unity'de 3D Yılan Oyunu 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.
Görev
OrtaScene, Snake'in segmentPrefab değerini kuyruğa benzer bir küp olarak ayarlar.
public Transform segmentPrefab;ekleyin.Step()içinde, kuyruk hareket etmeden önce kuyruğun son segmentinin hücresiniVector3 tailEndiçinde saklayın (kuyruk boşsa başın hücresi).- Baş yiyeceğin üzerindeyken
segmentPrefab'ıtailEndkonumunda oluşturuptail'e ekleyin, ardındanEat()çağrısını yapın.
Play'e basıp birkaç tane yiyin, ardından Check'e basın.
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 sayısı
public int edge = 7; // tahtadaki hücreler -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ı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;
}
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;
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.