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.
Tantangan
Sulit- Tambahkan
public float speedUp = 0.005f;danpublic float minTick = 0.08f;keSnake. - Saat ular makan, buat
ticklebih pendek sebesarspeedUp, tetapi jangan pernah lebih pendek dariminTick.
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();
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.