user-gear添加玩家逻辑

在 All Out 中,玩家是一级游戏对象。你的 Player :: class : Player_Base 是你放置 每个玩家的状态 (生命值、配装、冷却时间、UI 切换、进度等)。

circle-exclamation

每个玩家的状态

将游戏状态存储在玩家本身或玩家拥有的对象上。

Player :: class : Player_Base {
    health: int;
    inventory_open: bool;
}

服务器 + 客户端:哪些代码在哪里运行?

All Out 会自动将游戏状态从服务器同步到客户端。你仍然需要决定 哪些代码应该在服务器上运行哪些可以只在本地运行.

两个常见检查:

  • is_local_or_server():游戏 UI + 输入处理(在服务器 + 本地客户端上运行)

  • is_local():纯视觉 UI/效果(仅在本地客户端上运行)

Player :: class : Player_Base {
    ao_late_update :: method(dt: float) {
        // 游戏 UI + 输入处理(服务器 + 本地客户端)
        if is_local_or_server() {
            // draw_ability_button(this, Shoot_Ability, 0);
            // 处理会改变游戏状态的点击/按键
        }

        // 仅限视觉效果的 UI(仅本地客户端)
        if is_local() {
            // UI.text(..., "等待主机...");
            // 粒子效果、屏幕震动等。
        }
    }
}
circle-info

如果某件事会影响世界(伤害、奖励、生成、胜负条件),就将其视为 服务器权威。如果它只是表现层(UI/粒子),就保持在本地。

玩家身份和资料数据

Player_Base 提供你会经常使用的身份字段:

  • p->get_username() -> string

  • p->get_user_id() -> string

  • p.avatar_color

  • p.device_kind (.PHONE, .TABLET, .PC)

持久化:在哪里存储玩家进度

  • 经济系统:货币(金币/宝石/xp),支持自动持久化 + 创作者门户编辑\n见 经济系统.

  • 保存:通用键值持久化(设置、任务状态、解锁列表等)\n见 保存系统.

  • Inventory:玩家库存中的物品堆叠/实例(可选自动保存)\n见 Inventory.

常见模式:在以下位置加载已保存的值 ao_start

最佳实践

  • 将每个玩家的状态保留在 Player. 不要为任何与玩家相关的内容使用全局变量。

  • 将游戏玩法与外观效果分开。 使用 is_local_or_server() 用于游戏输入/UI, is_local() 用于仅本地可见的视觉效果。

  • 优先使用内置的持久化 API 而不是自己从头实现(Economy/Save/Inventory)。

Player_Base 参考

参见 Player_Base 中的类 core:ao (继承自 AO_Player : Component)用于常用字段和方法。

最后更新于