> For the complete documentation index, see [llms.txt](https://docs.allout.game/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.allout.game/all-out-docs/docs-zh/jiao-ben-bian-xie/game-frame-lifecycle.md).

# 游戏/帧生命周期

与 Roblox 这类事件驱动脚本不同，All Out 上的游戏使用帧生命周期模型，允许你在游戏开始时、每一帧以及会话结束时运行代码。

All Out 游戏运行在一个简单的生命周期上：有些回调在启动时只执行一次，有些则每帧都会执行。

你会以以下两种方式实现这些回调之一：

* **全局** （顶层 `ao_*` 过程 `main.csl`），或者
* **在组件上** （诸如……的方法 `ao_update` 在……内部 `Player` 或你自己的 `Component` 子类）

{% hint style="info" %}
如果你在寻找“模板” `main.csl`，请参见 [CSL 入门](/all-out-docs/docs-zh/jiao-ben-bian-xie/syntax.md).
{% endhint %}

## 全局生命周期（场景级）

这些是……中的顶层过程 `main.csl`:

### `ao_before_scene_load`

在空的 `Scene` 已创建但在其序列化的实体和组件加载之前运行。这通常是你注册场景加载时所需定义的地方：

* 物品定义（库存系统）
* 货币（经济系统）
* 全局配置值/常量

### `ao_start`

在场景启动时运行一次。

常见用途：

* 生成运行时实体/预制体
* 初始化全局系统
* 读取游戏范围的存档数据

### `ao_update(dt)`

每帧运行。

常见用途：

* 游戏计时器、波次管理器
* 依赖时间的生成逻辑
* 游戏规则

### `ao_late_update(dt)`

在……之后每帧运行 `ao_update`.

常见用途：

* 依赖本帧最终位置/状态的场景级工作
* 更新后的“清理”工作

玩家 UI 应放在 `Player.ao_late_update`，而不是这个全局回调中。

### `ao_draw(dt)`

仅用于表现；在可能渲染的提交上运行，并跳过重模拟。 `dt` 是提交的模拟增量；请使用 `get_time()` 获取绝对时间。

不要在这里放置游戏玩法或交互式 UI。请使用 `ao_update`/`ao_late_update` （通常 `Player.ao_late_update` 用于 UI）。

## 组件生命周期（每实体）

组件（包括 `Player`）可以实现：

* `ao_start()`
* `ao_update(dt)`
* `ao_late_update(dt)`
* `ao_draw(dt)` （仅用于视觉效果；可渲染帧）
* `ao_end()`
* `ao_on_state_sync()` （在网络状态同步时调用）

{% hint style="warning" %}
`ao_start()` 不会为每个客户端重放。当某个对象已在服务器上开始后，客户端才加入时，同步后的组件可能到达时其启动生命周期已经完成。不要使用 `ao_start()` 用于每个加入的客户端都必须运行的客户端本地展示初始化；请在同步状态中重建该展示于 `ao_on_state_sync()` 上存储每个玩家的状态。
{% endhint %}

示例：

```go
Orbiter :: class : Component {
    ao_start :: method() {
        // 初始化
    }

    ao_update :: method(dt: float) {
        // 每帧行为
    }

    ao_end :: method() {
        // 清理（销毁时）
    }
}
```

## 代码放在哪里：经验法则

* **每个玩家的状态/逻辑**：放在 `Player` （见 [添加玩家逻辑](/all-out-docs/docs-zh/jiao-ben-bian-xie/player-model.md))
* **可复用的实体行为**：将它们放在自定义组件上（见 [实体与组件](/all-out-docs/docs-zh/jiao-ben-bian-xie/entities-and-components.md))
* **全局协调/规则**：把它放在全局生命周期（`ao_*` 过程）

## 服务器 vs 本地

全局和组件的游戏玩法回调会在预测客户端和服务器上运行。不要用 `Game.is_server()`.

从该玩家的 `ao_late_update` 调用栈，包裹在 `is_local_or_server()`。请使用 `is_local()` 仅用于玩家特定的视觉覆盖。仅在 `is_local()` 下更改的状态

会被下一次服务器同步替换。 `这些是……上的方法`Player\_Base `is_local_or_server()` / `is_local()` 。在玩家引用上调用它们，或者作为 `Player` 在一个……内部作为一个方法（隐式 `在结构体/类内部。方法带有一个隐式的`).
