Version: 6000.3
语言: 中文
处理事件
检查器可配置的自定义事件

事件函数

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

MonoBehaviour-派生类,以允许游戏对象对源事件做出反应。

有关可用回传的完整列表,请参阅 MonoBehaviour Scripting API 参考页面,它们列在 Messages 下。本节的其余部分概述了一些关键的事件函数组。

定期更新事件

游戏就像动画一样,动画帧是动态生成的。游戏编程中的一个关键概念是在渲染每一帧之前更改对象的位置、状态和行为。这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 函数将在接触建立、保持和断开时被调用。当对象碰撞体一种不可见的形状,用于处理对象的物理碰撞。碰撞体不需要与对象的网格体完全相同的形状 - 在游戏中,粗略的近似值通常更有效且难以区分。更多信息
请参阅术语表
配置为 Trigger(即,一个碰撞器,它只是检测某物何时进入它,而不是做出物理反应)。如果在物理更新期间检测到多个接触,则可能会连续多次调用这些函数,因此将参数传递给函数,提供碰撞的详细信息(位置、传入对象的身份等)。

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

其他资源

处理事件
检查器可配置的自定义事件