Menu
CoddyTech

Ogon

Lekcja 7 z 14 w kursie Gra w Unity: Wąż 3D w Coddy.

Ogon jest listą segmentów, List<Transform> tail, od segmentu za głową, tail[0], aż do końca. Scena rozpoczyna grę z wężem składającym się z dwóch segmentów, Tail1 i Tail2, ustawionych w Inspectorze.

W każdym kroku każdy segment zajmuje komórkę segmentu przed sobą, a tail[0] zajmuje komórkę głowy. Kolejność ma znaczenie. Gdyby zacząć od przodu, tail[1] skopiowałby komórkę, do której tail[0] już się przesunął, i cały ogon skupiłby się w jednej komórce. Zaczynając od tyłu, każdy segment kopiuje komórkę, która jeszcze się nie zmieniła. Pasażerowie przesuwający się o jedno miejsce w tył działają tak samo:

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

Głowa przesuwa się jako ostatnia, gdy tail[0] zajmie już jej poprzednią komórkę.

challenge icon

Wyzwanie

Średni
  1. Dodaj using System.Collections.Generic; i public List<Transform> tail = new List<Transform>();. Scena wypełnia ją elementami Tail1 i Tail2.
  2. W Step(), tuż przed ruchem głowy, przesuń ogon: każdy segment, zaczynając od tyłu, zajmuje komórkę segmentu przed nim, a tail[0] zajmuje komórkę głowy.

Naciśnij Play i steruj: ogon podąża ścieżką głowy. Następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // sekundy między dwoma krokami
    public int edge = 7;         // pola planszy rozciągają się od -edge do edge
    public bool alive = true;
    private float timer;
    private Vector3 direction = Vector3.right;       // kierunek, w którym głowa poruszyła się w ostatnim kroku
    private Vector3 nextDirection = Vector3.right;   // skręt oczekujący na następny krok

    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;
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra w Unity: Wąż 3D