三条车道
本课属于 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。
挑战
中等让箭头控制跑步者在三条跑道之间移动。
- 在
Runner的Update()中,按下Input.GetKeyDown(KeyCode.LeftArrow)时执行lane--,按下右箭头时执行lane++。 - 让跑步者留在道路上:
lane = Mathf.Clamp(lane, -1, 1);。 - 将
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 在线编辑器