Menu
CoddyTech

尾巴

Coddy Unity 3D 贪吃蛇游戏 课程的第 7 课,共 14 课。

尾部是一个线段列表,List<Transform> tail,从紧跟在头部后面的线段 tail[0] 一直到末尾。场景在 Inspector 中设置了两段尾部,Tail1 和 Tail2,作为蛇的初始尾部。

每次移动时,每段线段都会移动到它前面那段线段所在的格子,而 tail[0] 会移动到头部所在的格子。顺序很重要。如果从前往后移动,tail[1] 会复制 tail[0] 已经移动到的格子,整个尾部就会堆在同一个格子里。如果从后往前移动,每段线段复制的都是尚未改变的格子。乘客往后挪一个座位时也是同样的道理:

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

等 tail[0] 移动到头部原来的格子后,头部最后移动。

challenge icon

挑战

中等

让蛇拥有一条跟随头部移动的尾巴。

  1. 在 Snake 中,添加 using System.Collections.Generic; 和 public List<Transform> tail = new List<Transform>();(场景中会添加 Tail1 和 Tail2)。
  2. 在 Step() 中,头部移动前,先从尾部开始,让每一节移动到前一节所在的格子;再让 tail[0] 移动到头部所在的格子。

按下 “开始” 并控制蛇的方向:尾巴会沿着头部走过的路径移动。然后点击 “检查”。

亲手试试

using UnityEngine;
using UnityEngine.InputSystem;

public class Snake : MonoBehaviour
{
    public float tick = 0.15f;   // 每两步之间的间隔秒数
    public int edge = 7;         // 棋盘格子的范围从 -edge 到 edge
    public bool alive = true;
    private float timer;
    private Vector3 direction = Vector3.right;       // 蛇头上一步移动的方向
    private Vector3 nextDirection = Vector3.right;   // 等待下一步执行的转向

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

Unity 3D 贪吃蛇游戏中的所有课

自己练习: Unity 在线编辑器