user-gear添加玩家逻辑

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

circle-exclamation

每个玩家的状态

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

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

服务器 + 客户端:什么在何处运行?

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

两个常见的判断:

  • 用于本地专用的 UI/粒子,和:游戏玩法 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/粒子),则保持本地。

玩家身份和资料数据

这些是 公开你会经常使用的身份字段:

  • p->get_username() -> string

  • p->get_user_id() -> string

  • p.avatar_color

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

持久化:存储玩家进度的位置

  • 经济系统:货币(金币/宝石/经验)具有自动持久化 + 创作者门户编辑 见 经济系统.

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

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

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

最佳实践

  • 将每个玩家的状态保存在 多个玩家会连接 —— 将每个玩家的状态存储在. 避免对任何与玩家相关的内容使用全局变量。

  • 将游戏玩法与外观分离。 使用 用于本地专用的 UI/粒子,和 对于游戏玩法输入/UI, is_local() 对于仅本地的视觉效果。

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

Player_Base 参考

请参阅 这些是 类位于 core:ao (继承自 AO_Player : Component)以获取常用字段和方法。

最后更新于