Menu
CoddyTech

Rośnij

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

Po zjedzeniu pokarmu wąż wydłuża się o jeden segment. Nowy segment trafia tam, gdzie przed ruchem znajdował się koniec ogona: ogon przesuwa się do przodu, a nowy segment zajmuje komórkę, którą opuścił jego koniec, więc wąż rośnie od tyłu.

Ta komórka znika, gdy ogon się przesunie, więc najpierw ją zapamiętaj. Następnie, gdy głowa dotrze do pokarmu, utwórz tam segment i dodaj go do listy, aby od następnego ruchu podążał za resztą. Utworzony segment, który nie zostanie dodany, nigdy się nie porusza. Pociąg dodaje wagon z tyłu w ten sam sposób:

Vector3 back = wagons[wagons.Count - 1].position;
// ... pociąg jedzie dalej ...
Transform wagon = Instantiate(wagonPrefab, back, Quaternion.identity);
wagons.Add(wagon);

Powiększ węża przed wywołaniem Eat(). Eat() przesuwa pokarm, a w następnej lekcji sprawisz, że będzie szukać komórki, której wąż nie zajmuje, uwzględniając nowy segment.

challenge icon

Wyzwanie

Średni

Scena ustawia segmentPrefab w Snake na kostkę taką jak segment ogona.

  1. Dodaj public Transform segmentPrefab;.
  2. W Step(), zanim ogon się przesunie, zachowaj komórkę ostatniego segmentu ogona w Vector3 tailEnd (komórkę głowy, gdy ogon jest pusty).
  3. Gdy głowa znajduje się na jedzeniu, utwórz instancję segmentPrefab w tailEnd i dodaj ją do tail, a następnie wywołaj Eat().

Naciśnij Play i zjedz kilka kawałków, a następnie naciśnij Check.

Spróbuj swoich sił

using System.Collections.Generic;
using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // sekundy między kolejnymi krokami
    public int edge = 7;         // pola planszy rozciągają się od -edge do edge
    public bool alive = true;
    public List<Transform> tail = new List<Transform>();
    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;
        }

        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))
        {
            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