Tumbuh
Pelajaran 8 dari 14 dalam kursus Game Unity: Snake 3D di Coddy.
Saat ular makan, panjangnya bertambah satu segmen. Segmen baru muncul di tempat ujung ekor sebelum bergerak: ekor bergeser ke depan, lalu segmen baru mengisi sel yang ditinggalkan ujung ekor, sehingga ular bertambah panjang dari bagian belakang.
Sel itu sudah tidak ada setelah ekor bergerak, jadi ingat posisinya terlebih dahulu. Lalu, saat kepala mencapai makanan, buat sebuah segmen di sana dan tambahkan ke list agar mulai mengikuti pada langkah berikutnya. Segmen yang dibuat tetapi tidak ditambahkan tidak akan bergerak. Kereta menambahkan gerbong di bagian belakang dengan cara yang sama:
Vector3 back = wagons[wagons.Count - 1].position;
// ... kereta terus bergerak ...
Transform wagon = Instantiate(wagonPrefab, back, Quaternion.identity);
wagons.Add(wagon);Tambahkan segmen sebelum memanggil Eat(). Eat() memindahkan makanan, dan pada pelajaran berikutnya, ular akan mencari sel yang tidak ditempati ular, termasuk segmen baru.
Tantangan
SedangAdegan ini menetapkan segmentPrefab milik Snake sebagai kubus seperti ekornya.
- Tambahkan
public Transform segmentPrefab;. - Di dalam
Step(), sebelum ekor bergerak, simpan sel segmen terakhir ekor diVector3 tailEnd(sel kepala saat ekor kosong). - Saat kepala berada di atas makanan, buat instance
segmentPrefabditailEnddan tambahkan ketail, lalu panggilEat().
Tekan Play dan makan beberapa makanan, lalu tekan Check.
Coba sendiri
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // detik antara dua langkah
public int edge = 7; // sel papan membentang dari -edge hingga edge
public bool alive = true;
public List<Transform> tail = new List<Transform>();
private float timer;
private Vector3 direction = Vector3.right; // arah gerak kepala pada langkah terakhir
private Vector3 nextDirection = Vector3.right; // arah belok yang menunggu langkah berikutnya
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;
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.