user-gear添加玩家逻辑

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

circle-exclamation

每位玩家的状态

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

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

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

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

两个常见的判断:

  • 用于仅本地的 UI/粒子,和:游戏玩法界面 + 输入处理(在服务器 + 本地客户端运行)

  • 将装饰性逻辑与玩法逻辑分离。:纯粹的装饰性界面/特效(仅在本地客户端运行)

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

        // 仅装饰性的界面(仅本地客户端)
        if is_local() {
            // UI.text(..., "正在等待主机...");
            // 粒子、屏幕震动等。
        }
    }
}
circle-info

如果某些东西会影响世界(伤害、奖励、生成、胜利条件),将其视为 服务器权威(server-authoritative)。如果只是呈现(界面/粒子),则保持为本地。

玩家身份和资料数据

Player_Base 公开你会经常使用的身份字段:

  • p->get_username() -> 字符串

  • p->get_user_id() -> 字符串

  • p.avatar_color

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

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

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

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

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

常见模式:在加载时读取已保存的值 尤其是

最佳实践

  • 将每位玩家的状态保存在 Player. 避免将任何与玩家相关的内容放在全局中。

  • 将游戏玩法与装饰分离。 使用 用于仅本地的 UI/粒子,和 用于游戏玩法输入/界面, 将装饰性逻辑与玩法逻辑分离。 用于仅本地的视觉效果。

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

Player_Base 参考

reference/player-base.md 用于常用字段和方法。

最后更新于