Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Adegan ini menetapkan segmentPrefab milik Snake sebagai kubus seperti ekornya.

  1. Tambahkan public Transform segmentPrefab;.
  2. Di dalam Step(), sebelum ekor bergerak, simpan sel segmen terakhir ekor di Vector3 tailEnd (sel kepala saat ekor kosong).
  3. Saat kepala berada di atas makanan, buat instance segmentPrefab di tailEnd dan tambahkan ke tail, lalu panggil Eat().

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;
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Unity: Snake 3D