23 个版本 (13 个破坏性版本)

0.14.0 2024年2月28日
0.13.0 2023年12月1日
0.12.0 2023年11月30日
0.8.1 2023年6月1日
0.4.1 2023年3月9日

#425解析器实现

Download history 71/week @ 2024-04-02 1/week @ 2024-04-09 5/week @ 2024-04-16 13/week @ 2024-04-23 8/week @ 2024-04-30 1/week @ 2024-05-07 7/week @ 2024-05-14 22/week @ 2024-05-21 16/week @ 2024-05-28 24/week @ 2024-06-04 31/week @ 2024-06-11 9/week @ 2024-06-18 12/week @ 2024-06-25 41/week @ 2024-07-02 8/week @ 2024-07-09 1/week @ 2024-07-16

每月下载量:65

MIT/Apache

360KB
1.5K SLoC

Bevy_save

Bevy 中保存和加载游戏状态的框架。

https://user-images.githubusercontent.com/29737477/234151375-4c561c53-a8f4-4bfe-a5e7-b69af883bf65.mp4

功能

保存文件管理

bevy_save 会自动使用您的应用程序工作空间名称在正确的位置为它在运行的任何平台创建一个唯一、永久的保存位置。

  • World::save()World::load() 使用您的应用程序的保存位置来保存和加载您的游戏状态,为您处理所有序列化和反序列化。
  • 这些方法接受一个 Pipeline,这是您将要如何保存和加载的强类型表示。
  • Pipeline trait 使用 Backend trait 作为磁盘/数据库和 bevy_save 之间的接口。
  • Backend trait 使用 Format trait 来确定实际保存文件应使用的格式(MessagePack / RON / JSON 等)。
    • 默认的 Pipeline 使用 FileIO 后端,通过给定的键将每个快照保存到磁盘上的单个文件。
      • 许多游戏有不同的要求,如保存到多个目录、数据库或 WebStorage。
      • 您可以通过实现自己的 Pipeline 并使用自定义的 Backend 来使用不同的 Backend
    • 默认的 Pipeline 配置为使用 rmp_serde 作为文件格式。
      • 您可以通过实现自己的 Pipeline 并使用自定义的 Format 来使用不同的 Format

保存目录位置

使用默认的 FileIO 后端,您的保存目录由您管理。

WORKSPACE 是您项目工作区(父文件夹)的名称。

Windows Linux/*BSD MacOS
C:\Users\%USERNAME%\AppData\Local\WORKSPACE\saves ~/.local/share/WORKSPACE/saves ~/Library/Application Support/WORKSPACE/saves

在WASM上,快照保存到 LocalStorage,键名为

WORKSPACE.KEY

快照和回滚

bevy_save 不仅关于保存文件,还关于对游戏状态的总控制。

这个crate引入了一个可能直接使用的快照类型

  • Snapshot 是所有可保存资源、实体和组件的可序列化快照。

或者通过 World 扩展方法

  • World::snapshot() 捕获当前游戏状态的快照,包括资源。
  • World::checkpoint() 捕获一个用于后续回滚/前滚的快照。
  • World::rollback() 通过您创建的任何检查点将游戏状态回滚或向前推进。

资源 Rollbacks 也可以让您对当前存储的回滚进行精细控制。

类型注册

bevy_save 为 Bevy 的 App 添加了注册应保存的类型的方法。只要类型实现了 Reflect,就可以注册并使用 bevy_save

  • App.init_pipeline::<P>() 初始化一个用于保存/加载的 Pipeline
  • App.allow_rollback::<T>() 允许类型回滚。
  • App.deny_rollback::<T>() 拒绝类型回滚。

类型过滤

bevy_save 允许您在创建快照时显式过滤类型。

实体映射

由于实体ID并不打算用作唯一标识符,bevy_save 支持映射实体ID。

首先,您需要获取一个 SnapshotApplier

  • 快照::应用器()
  • SnapshotApplier::新建()

然后 SnapshotApplier 将允许您在应用之前配置实体映射(和其他设置)

let snapshot = Snapshot::from_world(world);

snapshot
    .applier(world)

    // Your entity map
    .entity_map(HashMap::default())

    // Despawn all entities matching (With<A>, Without<B>)
    .despawn::<(With<A>, Without<B>)>()

    .apply();

映射实体

bevy_save 也通过反射支持 MapEntities,允许您在组件和资源内部更新实体ID。

请参阅 Bevy的父组件 以获取一个简单示例。

实体钩子

您还可以在应用快照时添加钩子,类似于 bevy-scene-hook

这可以用于许多事情,比如将快照作为实体的子实体生成

let snapshot = Snapshot::from_world(world);

snapshot
    .applier(world)

    // This will be run for every Entity in the snapshot
    // It runs after the Entity's Components are loaded
    .hook(move |entity, cmds| {
        // You can use the hook to add, get, or remove Components
        if !entity.contains::<Parent>() {
            cmds.set_parent(parent);
        }
    })

    .apply();

钩子也可以销毁实体

let snapshot = Snapshot::from_world(world);

snapshot
    .applier(world)

    .hook(|entity, cmds| {
        if entity.contains::<A>() {
            cmds.despawn();
        }
    })

部分快照

虽然 bevy_save 旨在尽可能简化保存整个世界的过程,但有些游戏还需要能够只保存世界的一部分。

Builder 允许您手动创建类似于 DynamicSceneBuilder 的快照。

fn build_snapshot(world: &World, target: Entity, children: Query<&Children>) -> Snapshot {
    Snapshot::builder(world)
        // Extract all resources
        .extract_all_resources()

        // Extract all descendants of `target`
        // This will include all components not denied by the builder's filter
        .extract_entities(children.iter_descendants(target))

        // Entities without any components will also be extracted
        // You can use `clear_empty` to remove them
        .clear_empty()

        // Build the `Snapshot`
        .build()
}

您还可以按类型提取资源。

Snapshot::builder(world)
    // Extract the resource by the type name
    // In this case, we extract the resource from the `manual` example
    .extract_resource::<FancyMap>()

    // Build the `Snapshot`
    // It will only contain the one resource we extracted
    .build()

此外,在构建快照时,还提供了显式类型过滤,例如 Applier

Snapshot::builder(world)
    // Exclude `Transform` from this `Snapshot`
    .deny::<Transform>()

    // Extract all matching entities and resources
    .extract_all()

    // Clear all extracted entities without any components
    .clear_empty()

    // Build the `Snapshot`
    .build()

管道

管道允许您在同一个 App 中使用多个不同的 BackendFormat 配置。

管道还允许您重用 Snapshot 应用程序和提取器。

许可证

bevy_save 在 MIT 和 Apache-2.0 许可下双许可。

功能标志

功能标志 描述 默认?
bevy_asset 启用 bevy_asset 类型注册
bevy_render 启用 bevy_render 类型注册
bevy_sprite 启用 bevy_sprite 类型注册
brotli 启用 Brotli 压缩中间件

兼容性

Bevy

注意:我们不跟踪 Bevy 主版本。

Bevy 版本 箱版本
0.13 0.14
0.12 0.10, 0.11, 0.12, 0.13
0.11 0.9
0.10 0.4, 0.5, 0.6, 0.7, 0.8
0.9 0.1, 0.2, 0.3

平台

平台 支持
Windows ✔️
MacOS ✔️
Linux ✔️
WASM ✔️
Android
iOS

✔️ = 第一类支持 — 🆗 = 尽力支持 — ⚡ = 未测试,但应该工作 — ❓ = 未测试,可能不会工作 — 🛠️ = 进行中

依赖关系

~22–63MB
~1M SLoC