OnCollisionEnter
本课属于 Coddy Unity 学习旅程的“物理与游戏玩法”单元。第 8 课,共 71 课。
当两个碰撞体开始接触时,Unity 会在两个对象各自的脚本上调用 OnCollisionEnter(Collision collision)。它只会在接触开始的那个物理步调用一次,接触持续期间不会再次调用。要发生碰撞,两个对象中至少有一个必须带有由物理系统移动的 Rigidbody。没有 Rigidbody 的墙和地板不会互相报告任何信息。
这个箱子会在落地时记录日志。它带有 Rigidbody,所以会下落,并在接触地板的那个物理步收到消息:
void OnCollisionEnter(Collision collision)
{
Debug.Log("Thud!");
}箱子只会记录一次,只有在离开地板并再次落地后才会再记录一次。地板也会收到消息:地板上的脚本也会检测到箱子落地,即使地板没有 Rigidbody。方法名和参数必须完全正确。名为 onCollisionEnter 的方法永远不会被调用,也不会报错。如果方法接收的是 Collider,Unity 会记录 Script error: OnCollisionEnter,并显示 This message parameter has to be of type: Collision,然后忽略它。两个对象保持接触时,Unity 会在每个物理步调用 OnCollisionStay;它们分开时,则调用一次 OnCollisionExit。
挑战
简单压力板会统计落在它上面的物体数量。
- 向
PressurePlate添加字段private int presses;。 - 添加
void OnCollisionEnter(Collision collision):将presses加 1,并记录"Pressed " + presses。
按“开始”:箱子落下,Console 中显示 Pressed 1,且只显示一次。然后按“检查”。
亲手试试
using UnityEngine;
public class PressurePlate : MonoBehaviour
{
// 每次落在压力板上都计数并记录:Pressed 1, Pressed 2, ...
}
物理与游戏玩法中的所有课
自己练习: Unity 在线编辑器