Menu
CoddyTech

滑行

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

挑战

简单

让跑步者从障碍物下方滑过。

  1. 添加 public float slideTime = 0.7f;、private float slide;,以及上文所示的 Resize 和 StopSlide。
  2. 跑步者在地面上时,按下 S 键或向下箭头键,将 slide = slideTime,然后调用 Resize(0.5f)。
  3. 每一帧中,只要 slide > 0f,就从它的值中减去 Time.deltaTime;当值变为 0 时,调用 StopSlide()。
  4. 跳跃会结束滑行:跑步者跳跃时,调用 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 在线编辑器