Menu
CoddyTech

挡板

Coddy Unity 游戏:打砖块 课程的第 1 课,共 19 课。

在这门课程中,你将在一节课里制作 3D 打砖块游戏,包含挡板、弹跳的小球、砖块墙、生命、关卡和强化道具。所有物体都在 z 为 0 的 x-y 平面上移动。脚本 Paddle、Ball、Brick、GameManager 和 PowerUp 目前都是空框架。点击 运行可以运行游戏,点击检查可以检查你的代码。

挡板有一个运动学 Rigidbody,通过在 FixedUpdate() 中使用 rb.MovePosition 移动,这样物理系统就能检测到它的移动。运动学刚体可以穿过墙壁,所以脚本会将它限制在墙内。如果把挡板中心限制在墙的位置,它的一半就会留在墙里:移动范围应为墙的位置减去挡板宽度的一半。墙的位置为 -6 和 6,挡板宽度为 2 时:

float half = 2f / 2f;
target.x = Mathf.Clamp(target.x, -6f + half, 6f - half);
rb.MovePosition(target);

挡板中心会保持在 -5 到 5 之间,因此两端恰好停在墙边。每一步都从 transform.localScale.x 读取宽度,这样挡板变宽时,移动范围也能保持正确。

challenge icon

挑战

简单

让挡板在两面墙之间移动。

  1. 在 Paddle 的 FixedUpdate() 中,设置 float input:按住左箭头键或 A 键时为 -1,按住右箭头键或 D 键时为 1,否则为 0。
  2. 计算 Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime;
  3. 使用 float half = transform.localScale.x / 2f;,将 target.x 限制在 -wallX + half 和 wallX - half 之间,然后执行 rb.MovePosition(target);

按“开始”,让挡板滑向两面墙:挡板会在两边停下。然后点击“检查”。

亲手试试

using UnityEngine;
using UnityEngine.InputSystem;

public class Paddle : MonoBehaviour
{
    public float speed = 14f;
    public float wallX = 8f;   // 两侧墙壁的内侧分别位于 -wallX 和 wallX

    Rigidbody rb;

    void Awake()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        // 用方向键或 A 和 D 移动,并保持在两侧墙壁之间。
    }
}

Unity 游戏:打砖块中的所有课

自己练习: Unity 在线编辑器