Menu
CoddyTech

Cái đuôi

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

Phần đuôi là một danh sách các đoạn, List<Transform> tail, kéo dài từ đoạn ngay sau đầu, tail[0], đến cuối. Cảnh bắt đầu với con rắn có hai đoạn, Tail1 và Tail2, được thiết lập trong Inspector.

Ở mỗi bước, từng đoạn chuyển đến ô mà đoạn phía trước nó đang ở, còn tail[0] chuyển đến ô của đầu. Thứ tự rất quan trọng. Nếu đi từ phía trước, tail[1] sẽ sao chép ô mà tail[0] đã chuyển đến, khiến toàn bộ đuôi chồng lên cùng một ô. Nếu đi từ phía sau, mỗi đoạn sao chép một ô chưa thay đổi. Những hành khách lùi về chỗ ngồi phía sau cũng di chuyển theo cách tương tự:

string[] seats = { "Ana", "Ben", "Cy" };
for (int i = seats.Length - 1; i > 0; i--)
{
    seats[i] = seats[i - 1];
}
seats[0] = "Dee";   // Dee, Ana, Ben

Đầu di chuyển sau cùng, khi tail[0] đã chuyển đến ô cũ của nó.

challenge icon

Thử thách

Trung bình

Thêm đuôi cho rắn để đuôi đi theo đầu.

  1. Trong Snake, thêm using System.Collections.Generic; và public List<Transform> tail = new List<Transform>(); (cảnh thêm Tail1 và Tail2).
  2. Trong Step(), ngay trước khi đầu di chuyển: bắt đầu từ phía sau, mỗi đoạn lấy ô của đoạn phía trước; tail[0] lấy ô của đầu.

Nhấn Play rồi điều khiển rắn: đuôi đi theo đường đi của đầu. Sau đó nhấn Check.

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
    public int edge = 7;         // Các ô trên bảng trải từ -edge đến edge
    public bool alive = true;
    private float timer;
    private Vector3 direction = Vector3.right;       // Hướng di chuyển của đầu ở bước trước
    private Vector3 nextDirection = Vector3.right;   // Hướng rẽ chờ đến bước tiếp theo

    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;
        }

        transform.position = next;

        if (GameManager.Instance.IsFood(next))
        {
            GameManager.Instance.Eat();
        }
    }

    void Die()
    {
        alive = false;
    }
}

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

Tự luyện tập: Playground Unity