Menu
CoddyTech

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。

challenge icon

挑战

简单

压力板会统计落在它上面的物体数量。

  1. 向 PressurePlate 添加字段 private int presses;。
  2. 添加 void OnCollisionEnter(Collision collision):将 presses 加 1,并记录 "Pressed " + presses。

按“开始”:箱子落下,Console 中显示 Pressed 1,且只显示一次。然后按“检查”。

亲手试试

using UnityEngine;

public class PressurePlate : MonoBehaviour
{
    // 每次落在压力板上都计数并记录:Pressed 1, Pressed 2, ...
}

物理与游戏玩法中的所有课

自己练习: Unity 在线编辑器