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.
Görev
OrtaHer yiyecek kuyruğa bir parça ekler.
Snakeiçindepublic Transform segmentPrefab;ekle (sahne bunu bağlar).Step()içinde, kuyruk hareket etmeden önceVector3 tailEnddeğerini sakla: kuyruğun boş olmadığı durumda son parçanın hücresi, kuyruk boş olduğunda ise başın hücresi.- Yiyecek yendiğinde
Instantiate(segmentPrefab, tailEnd, Quaternion.identity)değerinitaillistesine ekle, ardındanEat()ç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