滑行
Coddy Unity 游戏:天空赛道 课程的第 4 课,共 21 课。
有些障碍物挂得太高,无法跳过:跑者会从它们下面滑过。滑行时,跑者会暂时变成原来一半高。
缩小对象也会缩小它的 CharacterController,但缩小是以中点为中心的,所以跑者的脚会浮在路面上方半个单位处。将跑者向下移动同样的半个单位。手动移动控制器时必须先将其禁用,否则它接下来的 Move 会撤销这次移动:
void Resize(float height)
{
controller.enabled = false;
transform.position += Vector3.up * (height - transform.localScale.y);
transform.localScale = new Vector3(1f, height, 1f);
controller.enabled = true;
}计时器 slide 会倒数滑行时间。计时结束后,跑者会通过 StopSlide 再次站起来:
void StopSlide()
{
if (transform.localScale.y < 1f) Resize(1f);
slide = 0f;
}挑战
简单让跑步者从障碍物下方滑过。
- 添加
public float slideTime = 0.7f;、private float slide;,以及上文所示的Resize和StopSlide。 - 跑步者在地面上时,按下 S 键或向下箭头键,将
slide = slideTime,然后调用Resize(0.5f)。 - 每一帧中,只要
slide > 0f,就从它的值中减去Time.deltaTime;当值变为 0 时,调用StopSlide()。 - 跳跃会结束滑行:跑步者跳跃时,调用
StopSlide()。
点击“开始”并按 S 键:跑步者会短暂蹲下,然后站起来。接着点击“检查”。
亲手试试
using UnityEngine;
public class Runner : MonoBehaviour
{
public float laneWidth = 2.5f;
public float laneSpeed = 16f;
public float jumpHeight = 1.6f;
public float gravity = -40f;
public int lane;
private CharacterController controller;
private float fallSpeed;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A) || Input.GetKeyDown(KeyCode.LeftArrow)) lane = Mathf.Max(-1, lane - 1);
if (Input.GetKeyDown(KeyCode.D) || Input.GetKeyDown(KeyCode.RightArrow)) lane = Mathf.Min(1, lane + 1);
bool jump = Input.GetKeyDown(KeyCode.W) || Input.GetKeyDown(KeyCode.UpArrow) || Input.GetKeyDown(KeyCode.Space);
if (jump && controller.isGrounded)
{
fallSpeed = Mathf.Sqrt(jumpHeight * -2f * gravity);
}
if (controller.isGrounded && fallSpeed < 0f) fallSpeed = -2f;
fallSpeed += gravity * Time.deltaTime;
float targetX = lane * laneWidth;
float x = Mathf.MoveTowards(transform.position.x, targetX, laneSpeed * Time.deltaTime);
Vector3 move = new Vector3(x - transform.position.x, fallSpeed * Time.deltaTime, 0f);
controller.Move(move);
}
}
Unity 游戏:天空赛道中的所有课
自己练习: Unity 在线编辑器