Menu
CoddyTech

保持速度

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

打砖块游戏中的球永远不会减速。它的 PhysicsMaterial 承担了大部分工作:弹性为 1 时,每次反弹都会保留全部速度;摩擦力为 0 时,墙壁不会拖慢它。墙壁没有材质,而 Unity 默认会对两个碰撞体的值取平均值:球的值为 1,墙壁的值为 0,因此反弹后的速度会减半。bounceCombine = Maximum 和 frictionCombine = Minimum 会让球自身的值优先生效。

物理效果仍不完全精确:移动的挡板会叠加自身速度,而微小误差经过数百次反弹后也会累积。因此,每个物理步中,球都会保留原来的方向,并将速度重新设定为:

rb.linearVelocity = rb.linearVelocity.normalized * 7f;

球的速度即使降到每秒 2 个单位,也会在下一个物理步重新达到 7。

challenge icon

挑战

简单

让球以恒定速度一直弹跳。

  1. 在 Ball 的 Awake() 中,创建 new PhysicsMaterial("Bouncy"),将弹性设为 1,将两种摩擦力都设为 0,将 bounceCombine = PhysicsMaterialCombine.Maximum 和 frictionCombine = PhysicsMaterialCombine.Minimum;将其设置到 GetComponent<Collider>().material 上。
  2. 添加 FixedUpdate():如果球已发射,则执行 rb.linearVelocity = rb.linearVelocity.normalized * speed;

点击运行并发射球:球会从每面墙上弹回,速度不会减慢。然后点击检查。

亲手试试

using UnityEngine;
using UnityEngine.InputSystem;

public class Ball : MonoBehaviour
{
    public Transform paddle;
    public float speed = 9f;

    Rigidbody rb;
    bool launched;

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

    void Update()
    {
        if (launched) return;
        transform.position = paddle.position + Vector3.up * 0.5f;
        if (Keyboard.current.spaceKey.wasPressedThisFrame) Launch(new Vector3(0.3f, 1f, 0f));
    }

    public void Launch(Vector3 direction)
    {
        launched = true;
        rb.linearVelocity = direction.normalized * speed;
    }
}

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

自己练习: Unity 在线编辑器