Menu
CoddyTech

三条车道

本课属于 Coddy Unity 学习旅程的“打造真正的游戏”单元。第 27 课,共 60 课。

这一章会制作一款无尽跑酷游戏。跑步者沿着一条有 3 条车道的道路向前奔跑,并通过切换车道躲避迎面而来的障碍物。在接下来的几课中,道路会加速,屏幕上会显示距离,撞车会结束本次奔跑,并提供一个重新开始的按钮,同时还会保存最佳成绩。跑步者不会向前移动:它停在 z = 0,障碍物向它移动,因此道路永远不会跑完。这款游戏有 4 个脚本,Runner、Spawner、Obstacle 和 GameManager,目前后三个脚本还是空的。

在车道上移动的跑步者不像汽车那样转向:它总是在几个固定位置中的一个。用整数记录位置,按下按键时改变这个数字,再根据它计算位置。这个擦窗工的升降平台服务于一栋有 5 层的建筑,每层相隔 3 个单位:

[SerializeField] private float floorHeight = 3f;
[SerializeField] private float moveSpeed = 6f;
private int floor = 0;

void Update()
{
    if (Input.GetKeyDown(KeyCode.UpArrow)) floor++;
    if (Input.GetKeyDown(KeyCode.DownArrow)) floor--;
    floor = Mathf.Clamp(floor, 0, 4);

    Vector3 p = transform.position;
    p.y = Mathf.MoveTowards(p.y, floor * floorHeight, moveSpeed * Time.deltaTime);
    transform.position = p;
}

GetKeyDown 会让每次按键只移动一层,而 GetKey 会在按住按键的每一帧都增加一层。Mathf.Clamp 会将数字限制在建筑的楼层范围内,因此在顶层按向上键不会有任何效果,接着按向下键就会直接到 3 楼。Mathf.MoveTowards 会让平台以每秒 moveSpeed 个单位的速度滑向目标楼层,并准确停在该楼层,而不是在一帧内跳过去。这里先复制位置,修改后再赋值回去,因为不能单独设置 transform.position.y。

challenge icon

挑战

中等

让箭头控制跑步者在三条跑道之间移动。

  1. 在 Runner 的 Update() 中,按下 Input.GetKeyDown(KeyCode.LeftArrow) 时执行 lane--,按下右箭头时执行 lane++。
  2. 让跑步者留在道路上:lane = Mathf.Clamp(lane, -1, 1);。
  3. 将 transform.position 复制到 p,使用 Mathf.MoveTowards 以 laneSpeed * Time.deltaTime 的速度让 p.x 朝 lane * laneWidth 移动,然后将 p 赋回去。

按下“开始”,点击游戏并切换跑道:跑步者会滑动移动。然后点击“检查”。

亲手试试

using UnityEngine;

public class Runner : MonoBehaviour
{
    public float laneWidth = 2.5f;
    public float laneSpeed = 15f;
    private int lane = 0;   // -1 表示左侧车道,0 表示中间车道,1 表示右侧车道

    void Update()
    {
        // 用方向键切换车道,然后向目标车道的 x 坐标平滑移动
    }
}

打造真正的游戏中的所有课

自己练习: Unity 在线编辑器