版本:Unity 6 (6000.0)
语言:英语
处理事件
事件函数执行顺序

事件函数

事件函数是一组预定义的回调函数,所有MonoBehaviour脚本组件都可能接收。这些回调函数由各种 Unity 编辑器和引擎事件触发,包括

在您的MonoBehaviour派生类中实现适当的方法签名,以允许您的游戏对象对源事件做出反应。

请参阅MonoBehaviour脚本 API 参考页面,以获取所有可用回调函数的完整列表,这些回调函数在消息下列出。本节的其余部分概述了某些关键事件函数组。

定期更新事件

游戏就像一个动画,其中动画帧是在运行时生成的。游戏编程中的一个关键概念是在渲染每个帧之前更改对象的 position、状态和行为。Update 函数是 Unity 中此类代码的主要位置。Update在渲染帧之前以及在计算动画之前被调用。

void Update() {
    float distance = speed * Time.deltaTime * Input.GetAxis("Horizontal");
    transform.Translate(Vector3.right * distance);
}

物理引擎一个模拟物理系统各个方面的系统,以便物体可以正确地加速并受到碰撞、重力和其它力的影响。 更多信息
参见 术语表
也以类似于帧渲染的方式以离散时间步长进行更新。另一个名为FixedUpdate 的单独事件函数在每个物理更新之前被调用。由于物理更新和帧更新的频率并不相同,因此如果您将物理代码放置在FixedUpdate函数而不是Update函数中,则可以从物理代码中获得更准确的结果。

void FixedUpdate() {
    Vector3 force = transform.forward * driveForce * Input.GetAxis("Vertical");
    rigidbody.AddForce(force);
}

有时在UpdateFixedUpdate函数对场景中所有对象都被调用之后,以及所有动画都被计算之后,进行额外的更改也很有用。此场景的一些示例是

  • 当一个摄像机一个创建场景中特定视点图像的组件。输出要么绘制到屏幕上,要么作为纹理捕获。 更多信息
    参见 术语表
    应该始终对准目标物体时。必须在目标物体移动后调整摄像机的方向。
  • 当脚本代码应该覆盖动画的效果时。例如,使角色的头朝向场景中的目标物体。

LateUpdate 函数可用于此类情况。

void LateUpdate() {
    Camera.main.transform.LookAt(target.transform);
}

初始化事件

在游戏过程中发生的任何更新之前,能够调用初始化代码通常很有用。Start 函数在第一个帧或物理更新之前在对象上被调用。Awake 函数在场景加载时被调用,用于场景中的每个对象。请注意,虽然各个对象的StartAwake函数以任意顺序被调用,但所有Awake实例将在第一个Start被调用之前完成。这意味着Start函数中的代码可以利用先前在Awake阶段执行的其它初始化。

GUI 事件

Unity 拥有一个系统,用于在场景中的主要动作之上渲染 GUI 控件,并响应对这些控件的点击。此代码的处理方式与常规帧更新有所不同,因此它应该放置在OnGUI 函数中,该函数将定期被调用。

void OnGUI() {
    GUI.Label(labelRect, "Game Over");
}

您还可以检测在场景中出现的游戏对象Unity 场景中的基本对象,可以代表角色、道具、场景、摄像机、航点等等。游戏对象的功用由附加到它的组件定义。 更多信息
参见 术语表
上的鼠标事件。这可以用于瞄准武器或显示当前位于鼠标指针下的角色的信息。一组以OnMouse为前缀的事件函数(例如,OnMouseOverOnMouseDown)允许脚本对用户与鼠标的交互做出反应。例如,如果在指针位于特定对象上时按下鼠标按钮,则如果该对象脚本中存在OnMouseDown函数,则该函数将被调用。

物理事件

物理引擎会通过调用该对象脚本上的事件函数来报告碰撞当物理引擎检测到两个游戏对象的碰撞器发生接触或重叠时,就会发生碰撞,前提是至少一个具有刚体组件且正在运动。 更多信息
参见 术语表
OnCollisionEnterOnCollisionStayOnCollisionExit函数将在发生接触、保持接触和断开接触时被调用。相应的OnTriggerEnterOnTriggerStayOnTriggerExit函数将在对象的碰撞器一个用于处理对象物理碰撞的不可见形状。碰撞器不需要与对象的网格完全相同形状 - 大致近似通常更有效且在游戏过程中无法区分。 更多信息
参见 术语表
被配置为触发器(即,只检测物体何时进入它的碰撞器,而不是物理反应)时被调用。如果在物理更新期间检测到多个接触,则这些函数可能会连续调用多次,因此会将一个参数传递给该函数,提供有关碰撞的详细信息(位置、传入对象的标识等)。

void OnCollisionEnter(Collision collision) {
    if (collision.gameObject.tag == "Arrow") {
        ApplyDamage(10);
    }
}

其他资源

处理事件
事件函数执行顺序