保持速度
Coddy Unity 游戏:打砖块 课程的第 3 课,共 19 课。
打砖块游戏中的球永远不会减速。它的 PhysicsMaterial 承担了大部分工作:弹性为 1 时,每次反弹都会保留全部速度;摩擦力为 0 时,墙壁不会拖慢它。墙壁没有材质,而 Unity 默认会对两个碰撞体的值取平均值:球的值为 1,墙壁的值为 0,因此反弹后的速度会减半。bounceCombine = Maximum 和 frictionCombine = Minimum 会让球自身的值优先生效。
物理效果仍不完全精确:移动的挡板会叠加自身速度,而微小误差经过数百次反弹后也会累积。因此,每个物理步中,球都会保留原来的方向,并将速度重新设定为:
rb.linearVelocity = rb.linearVelocity.normalized * 7f;球的速度即使降到每秒 2 个单位,也会在下一个物理步重新达到 7。
挑战
简单让球以恒定速度一直弹跳。
- 在
Ball的Awake()中,创建new PhysicsMaterial("Bouncy"),将弹性设为 1,将两种摩擦力都设为 0,将bounceCombine = PhysicsMaterialCombine.Maximum和frictionCombine = PhysicsMaterialCombine.Minimum;将其设置到GetComponent<Collider>().material上。 - 添加
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 在线编辑器