撞击时破碎
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 10 课,共 71 课。
撞击有多猛烈?collision.relativeVelocity 表示两个对象相遇时彼此接近的速度,而它的magnitude就是撞击速度,单位为 m/s。一切取决于速度差:一辆以 10 m/s 行驶的汽车撞上另一辆同向行驶、速度为 8 m/s 的汽车时,撞击速度只有 2 m/s,而且两辆车测得的撞击速度相同。
这个鸡蛋落地时的速度超过crackSpeed就会碎。从 1 m 高处落下时,撞击速度约为 4.4 m/s(2 x 9.81 x 1 的平方根);从 2 m 高处落下时,约为 6.3 m/s:
public float crackSpeed = 5f;
void OnCollisionEnter(Collision collision)
{
if (collision.relativeVelocity.magnitude > crackSpeed)
{
Debug.Log("Splat!");
Destroy(gameObject);
}
}为什么不用鸡蛋自身的rb.linearVelocity?等到OnCollisionEnter运行时,物理系统已经处理完撞击,所以鸡蛋剩余的速度接近于零。relativeVelocity保留了撞击本身的速度。它表示速度,因此质量不会产生影响:一个重鸡蛋和一个轻鸡蛋以 6 m/s 落地时,报告的速度都是 6。
挑战
简单编写 Window.cs:每次撞击都会削弱窗口,当强度降到 0 时,窗口就会破碎。
- 在窗口的
OnCollisionEnter中,从strength中减去collision.relativeVelocity.magnitude。 - 当
strength <= 0f时,调用Destroy(gameObject);。
按“开始”,用向上箭头发射速度较慢的球,然后按 Space 发射速度较快的球:窗口会破碎。然后点击“检查”。
亲手试试
using UnityEngine;
public class Window : MonoBehaviour
{
public float strength = 10f;
// 每次撞击都会从 strength 中减去撞击速度;降到 0 时,窗户就会碎裂。
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器