Dilarang Berbalik
Pelajaran 3 dari 14 dalam kursus Game Unity: Snake 3D di Coddy.
Ular yang berbelok lurus ke belakang akan menabrak lehernya sendiri, jadi belokan ke arah yang berlawanan dengan arah geraknya diabaikan. Arah yang berlawanan adalah arah negatifnya: saat ular bergerak ke kanan, -direction adalah Vector3.left.
Vector3 heading = Vector3.right;
Vector3 back = -heading; // (-1, 0, 0), Vector3.left
bool reverse = Vector3.left == back; // trueMembandingkan dengan direction tidak cukup ketika sekali menekan tombol langsung mengubah direction. Saat bergerak ke kanan, pemain menekan atas lalu kiri dalam satu tick. Atas diizinkan. Kemudian, kiri diperiksa terhadap atas, yaitu belokan yang belum terjadi, dan juga diizinkan, sehingga langkah berikutnya bergerak ke kiri, lurus kembali melewati leher.
Solusinya menggunakan dua arah. direction adalah arah gerak kepala pada langkah terakhirnya; nextDirection adalah belokan yang menunggu langkah berikutnya. Tombol mengubah nextDirection, tetapi hanya setelah belokan dibandingkan dengan direction, dan langkah dimulai dengan menerapkan belokan yang menunggu. Pada kasus di atas, kiri dibandingkan dengan kanan, arah gerak kepala yang sebenarnya, lalu diabaikan.
Tantangan
Mudah- Tambahkan
private Vector3 nextDirection = Vector3.right;, yaitu belokan yang menunggu langkah berikutnya. - Tulis
void Turn(Vector3 newDirection): fungsi ini menetapkannextDirectionkenewDirection, kecuali jikanewDirectionberlawanan arah dengandirection. - Di
Update(), setiap tombol memanggilTurndengan arahnya, bukan menetapkandirection. - Di awal
Step(), tetapkandirectionkenextDirection.
Tekan Play dan coba berbalik arah, lalu tekan Check.
Coba sendiri
using UnityEngine;
using UnityEngine.InputSystem;
public class Snake : MonoBehaviour
{
public float tick = 0.15f; // detik di antara dua langkah
private float timer;
private Vector3 direction = Vector3.right;
void Update()
{
Keyboard keyboard = Keyboard.current;
if (keyboard != null)
{
if (keyboard.upArrowKey.wasPressedThisFrame || keyboard.wKey.wasPressedThisFrame) direction = Vector3.forward;
if (keyboard.downArrowKey.wasPressedThisFrame || keyboard.sKey.wasPressedThisFrame) direction = Vector3.back;
if (keyboard.leftArrowKey.wasPressedThisFrame || keyboard.aKey.wasPressedThisFrame) direction = Vector3.left;
if (keyboard.rightArrowKey.wasPressedThisFrame || keyboard.dKey.wasPressedThisFrame) direction = Vector3.right;
}
timer += Time.deltaTime;
if (timer >= tick)
{
timer -= tick;
Step();
}
}
void Step()
{
transform.position += direction;
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.