Menu
CoddyTech

Semakin Cepat

Pelajaran 13 dari 14 dalam kursus Game Unity: Snake 3D di Coddy.

Snake menjadi lebih sulit saat ukurannya bertambah: setiap makanan membuat tick sedikit lebih singkat, sehingga snake melangkah lebih cepat. Batas bawah menjaga game tetap bisa dimainkan: tick terpendek yang bisa dicapai.

Mathf.Max mengembalikan nilai yang lebih besar dari dua angka, sehingga menjadi batas bawah: Mathf.Max(value, floor) tidak pernah lebih kecil dari floor. Turret yang menembak lebih cepat setiap kali di-upgrade, tetapi tidak pernah lebih sering dari setiap 0.2 detik:

cooldown = Mathf.Max(cooldown - 0.05f, 0.2f);

Mathf.Min adalah kebalikannya, yaitu batas atas. Mudah keliru menggunakannya: dengan Min, cooldown di atas akan turun menjadi 0.2 pada upgrade pertama. Timer di Update() membaca tick pada setiap frame, jadi tick yang lebih singkat mulai dihitung pada langkah berikutnya.

challenge icon

Tantangan

Sulit
  1. Tambahkan public float speedUp = 0.005f; dan public float minTick = 0.08f; ke Snake.
  2. Saat ular makan, buat tick lebih pendek sebesar speedUp, tetapi jangan pernah lebih pendek dari minTick.

Tekan Mainkan dan makan: ular akan bergerak lebih cepat. Lalu tekan Periksa.

Coba sendiri

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // detik di antara dua langkah
    public int edge = 7;         // sel-sel papan terbentang dari -edge hingga edge
    public bool alive = true;
    public List<Transform> tail = new List<Transform>();
    public Transform segmentPrefab;
    private float timer;
    private Vector3 direction = Vector3.right;       // arah gerak kepala pada langkah terakhirnya
    private Vector3 nextDirection = Vector3.right;   // belokan 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 = 0; i < tail.Count - 1; i++)
        {
            if (tail[i].position == next)
            {
                Die();
                return;
            }
        }

        Vector3 tailEnd = tail.Count > 0 ? tail[tail.Count - 1].position : transform.position;
        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))
        {
            tail.Add(Instantiate(segmentPrefab, tailEnd, Quaternion.identity));
            GameManager.Instance.Eat();
        }
    }

    public bool Occupies(Vector3 cell)
    {
        if (transform.position == cell) return true;
        foreach (Transform segment in tail)
        {
            if (segment.position == cell) return true;
        }
        return false;
    }

    void Die()
    {
        alive = false;
        GameManager.Instance.GameOver();
    }
}
quiz iconUji dirimu

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

Semua pelajaran di Game Unity: Snake 3D