挡板
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 读取宽度,这样挡板变宽时,移动范围也能保持正确。
挑战
简单让挡板在两面墙之间移动。
- 在
Paddle的FixedUpdate()中,设置float input:按住左箭头键或 A 键时为 -1,按住右箭头键或 D 键时为 1,否则为 0。 - 计算
Vector3 target = rb.position + Vector3.right * input * speed * Time.fixedDeltaTime; - 使用
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 在线编辑器