Menu
CoddyTech

Không quay đầu

Bài học 3 trên 14 trong khóa học Game Unity: rắn 3D của Coddy.

Rắn quay ngược lại theo đường thẳng sẽ đâm vào cổ của mình, nên lệnh quay theo hướng ngược lại sẽ bị bỏ qua. Hướng đối diện là hướng ngược lại: khi rắn di chuyển sang phải, -direction là Vector3.left.

Chỉ so sánh với direction là chưa đủ khi một lần nhấn phím thay đổi hướng ngay lập tức: rắn đang di chuyển sang phải, người chơi nhấn lên rồi nhấn trái trong cùng một nhịp. Hướng lên được chấp nhận, sau đó hướng trái được so sánh với hướng lên và cũng được chấp nhận, khiến bước tiếp theo quay ngược qua cổ.

Vì vậy, hãy giữ hai hướng: direction, hướng đầu rắn vừa di chuyển, và nextDirection, hướng rẽ đang chờ bước tiếp theo. Khi nhấn phím, hãy cập nhật nextDirection sau khi so sánh với direction, rồi bước di chuyển sẽ thực hiện hướng rẽ đang chờ.

challenge icon

Thử thách

Dễ

Ngăn rắn quay đầu thẳng lại về phía cổ.

  1. Thêm private Vector3 nextDirection = Vector3.right; và void Turn(Vector3 newDirection): đặt nextDirection trừ khi newDirection == -direction.
  2. Trong Update(), mỗi phím gọi Turn với hướng tương ứng thay vì đặt direction.
  3. Ở đầu Step(), đặt direction = nextDirection;

Nhấn Chơi rồi nhấn trái khi đang di chuyển sang phải: rắn tiếp tục đi sang phải. Sau đó nhấn Kiểm tra.

Tự làm thử

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // Số giây giữa hai bước di chuyển
    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;
    }
}

Tất cả bài học trong Game Unity: rắn 3D

Tự luyện tập: Playground Unity