
Bevy 迁移指南bevy_shape从bevy_math中拆分几何体原语的导入路径与 trait 变更全解【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy本指南对应 Bevy 官方迁移文档 bevy_shape.mdPull Request #25302。新版 Bevy 将原先集中在bevy_math中的几何原语geometric primitives及相关 trait 拆分为独立 cratebevy_shape这意味着直接依赖bevy_math并从中导入Circle、Cuboid等类型的代码需要迁移到新的导入路径。阅读本文后你将清楚掌握哪些类型与 trait 发生了搬迁、新导入路径长什么样、Cargo.toml如何调整以及为什么大量使用bevy::prelude::*的代码可能无需任何改动。一、迁移背景为什么要从bevy_math中拆出bevy_shape在拆分之前Bevy 的几何体原语如二维的Circle、Rectangle、Triangle2d三维的Sphere、Cuboid、Capsule3d等以及围绕它们的一系列 traitPrimitive2d/Primitive3d、Bounded2d/Bounded3d、ShapeSample等都存放在bevy_mathcrate 的primitives模块之下。拆分之后bevy_shape成为一个以“几何体原语”为核心的独立 crate。这一点从它的包描述可以得到印证bevy_shape在 Cargo.toml 中自称 Provides primitive shape data definitions for Bevy Engine并且是一个#![no_std]友好的 crate见 lib.rs只依赖bevy_math、bevy_reflect、rand、serde等少数底层库。从源码布局看bevy_shape的内部结构相当清晰基本是按功能域组织的dim2.rs全部 2D 原语Circle、Arc2d、Ellipse、Rectangle、Polygon、RegularPolygon、Capsule2d、Triangle2d、Annulus等dim3.rs全部 3D 原语Sphere、Cuboid、Cylinder、Cone、Capsule3d、Torus、ExtrusionT等bounding/包围体相关 trait 与实现Aabb2d/Aabb3d、BoundingCircle/BoundingSphere、射线与包围体求交等sampling/形状表面/内部随机采样ShapeSample、UniformMeshSamplerinset.rs形状等距内缩Inset其他独立文件如 half_space.rs、ray.rs、view_frustum.rs。参考 dim2.rs 中对Circle的定义可以看出新 crate 中的原语与原先的 API 风格保持一致字段公开如radius: f32、提供new构造函数、实现Primitive2d标记 trait并附带area()、perimeter()等测量方法——类型本身的用法没有变化变化的是它们“住在哪个模块、从哪里导入”。二、发生了什么变化类型与 trait 的迁移清单1. 所有原语从bevy_math::primitives::*迁出文档明确指出所有bevy_math::primitives::*现在都暴露在bevy_shape的顶层bevy_shape::*或bevy_shape::prelude::*中。换句话说原先需要写bevy_math::primitives::Circle、bevy_math::primitives::Cuboid的代码现在需要改为bevy_shape::Circle、bevy_shape::Cuboid或直接使用 prelude。而bevy_math本身已经不再包含primitives模块——在 bevy_math/src/lib.rs 中我们已经看不到primitives的踪迹它现在专注于向量、矩阵、四元数、方向类型Dir2/Dir3、Rot2、Isometry2d/Isometry3d、AspectRatio等纯数学类型。作为补充背景原本 2D 几何体位于bevy_math::primitives::dim2、3D 位于bevy_math::primitives::dim3如今这种二三维分层被完整保留在bevy_shape的内部模块中只是在公开 API 上被扁平化重导出见 lib.rs使bevy_shape::Circle这样的顶层路径可以直接可用。2. 从bevy_math迁入bevy_shape的 trait 完整列表文档给出了需要特别注意的 8 个 traitTrait说明仓库内定义位置Primitive2d/Primitive3d标记 2D/3D 几何原语的 marker traitlib.rsBounded2d/Bounded3d让形状生成包围体Aabb、BoundingCircle/BoundingSphere的抽象bounding/bounded2d/mod.rs、bounding/bounded3d/mod.rsBoundingVolume/IntersectsVolume包围体通用抽象与体积相交测试抽象bounding/mod.rs、bounding/mod.rsToRing把可内缩的 2D 原语转成圆环Ringdim2.rsInset原语沿边等距内缩、用于生成轮廓/空心形状inset.rsShapeSample在形状内部或边界上均匀随机采样sampling/shape_sampling.rs这里可以顺带澄清文档未展开的两组 trait 的具体职责方便你在迁移时对照自己的使用场景包围体体系Bounded2d/Bounded3d为形状提供生成包围体的能力生成结果Aabb2d、BoundingCircle、Aabb3d、BoundingSphere是实现了BoundingVolume的具体类型而IntersectsVolume抽象的是“某个体积/测试与另一个包围体是否相交”的判断可用于射线检测、重叠判定、视锥剔除等。从 bounding/mod.rs 的模块文档可以确认这套四 trait 体系的定位。内缩与圆环Inset::inset会把形状沿边内缩一定距离ToRing::to_ring在此基础上生成一个“外轮廓 指定厚度”的Ring常用于描边类渲染详见 inset.rs 的文档注释。3. 一个顺带的“惊喜”变化包围体 trait 进入了 prelude文档特别提醒Bounded2d、Bounded3d、BoundingVolume与IntersectsVolume这四个 trait现在也被加入了 prelude而此前并非如此。也就是说如果你的代码里存在下面这类“为了能用方法而显式导入 trait”的语句use bevy_math::bounding::{Bounded2d, BoundingVolume};迁移后可以先检查这些use是否已经多余若仍在使用旧路径则必须更新新路径见下表。如果已经通过bevy::prelude::*或bevy_shape::prelude::*导入了 prelude这些显式导入通常可以直接删除。三、迁移路径速查新旧导入对照综合官方迁移文档与仓库源码最常见的路径变化如下旧路径 → 新路径// 旧写法bevy_math 时代 use bevy_math::primitives::{Circle, Cuboid, Capsule3d}; use bevy_math::primitives::dim2::Rectangle; use bevy_math::bounding::{Bounded2d, Aabb2d}; // 新写法bevy_shape 时代 use bevy_shape::{Circle, Cuboid, Capsule3d, Rectangle}; use bevy_shape::bounding::{Bounded2d, Aabb2d};bevy_shape的 prelude 内容可以看 lib.rs 的实现它把全部模块一次性重导出包括Measured2d/Measured3d、WindingOrder、bounding::*、dim2::*、dim3::*、half_space::*、inset::*、Ray2d/Ray3d以及受 feature 控制的sampling::ShapeSample与polygon::*。因此对大多数用户而言一句use bevy_shape::prelude::*;就能覆盖全部需求。四、三分钟完成迁移具体操作步骤步骤 1判断自己是否需要改动官方迁移文档给了一个非常实用的判定标准如果你使用的是bevy::prelude::*即引擎全局 prelude那么基本不需要做任何修改因为上述所有内容仍然被包含在全局 prelude 中。这一论断可以在源码中得到验证在 crates/bevy_internal/src/prelude.rs 中Bevy 的全局 prelude 组合了各 crate 的 prelude其中明确包含shape::prelude::*而 crates/bevy_internal/src/lib.rs#L91 则将bevy_shape以模块shape的形式重导出为bevy::shape。因此通过bevy引擎依赖使用、且习惯写use bevy::prelude::*;或bevy::shape::Circle的代码 →无需任何改动直接依赖bevy_math、并从bevy_math::primitives::*导入几何类型 / 从bevy_math导入上述 trait 的代码 →需要迁移。步骤 2调整 Cargo.toml加入bevy_shape依赖对直接依赖bevy_math的库或工程文档建议“现在可能需要把bevy_shape加为依赖并从那里导入所需结构”。参照仓库内 bevy_shape/Cargo.toml 的元数据版本0.20.0-devedition2024可以这样声明[dependencies] bevy_math 0.20 bevy_shape 0.20如果你只需要形状定义而不需要随机采样甚至可以按需裁剪默认 feature。bevy_shape提供的 feature 如下对应 Cargo.tomlFeature作用说明default默认开启[rand, std]包含随机采样与标准库支持std标准库支持同时会开启alloc、bevy_math/std等alloc无 std 环境下的堆分配支持依赖bevy_math/allocrand启用ShapeSample形状采样引入rand与rand_distr为no_std保留扩展性serialize为原语派生serde序列化依赖bevy_math/serializebevy_reflect为原语派生反射能力需要先开启alloc在引擎内如何聚合使用这些 feature可以参考 crates/bevy_internal/Cargo.toml 与 crates/bevy_internal/Cargo.toml 中对bevy_shape/serialize、bevy_shape/std的转发声明。步骤 3批量替换导入语句把形如下面的旧导入整体替换到新路径即可这里以直接使用 crate 名、不使用全局 prelude 的场景为例// 迁移前 use bevy_math::primitives::{Circle, RegularPolygon, Capsule3d, Cone}; use bevy_math::bounding::{Aabb3d, BoundingSphere}; // 迁移后 use bevy_shape::prelude::*; // 或按需逐个导入 // use bevy_shape::{Circle, RegularPolygon, Capsule3d, Cone}; // use bevy_shape::bounding::{Aabb3d, BoundingSphere};步骤 4复查已显式导入的包围体 trait如第二节所述Bounded2d、Bounded3d、BoundingVolume、IntersectsVolume已进入 prelude。迁移时顺手检查若你的use列表里有这四个 trait 的显式导入且周围代码已经使用了bevy::prelude::*或bevy_shape::prelude::*可以尝试删除这些多余导入交由编译器确认。五、迁移后你仍然拥有的能力附源码佐证拆分并没有削弱任何功能迁移完成后你依然可以从新家获得全部原有能力。以几个常见用法为例这些代码在迁移后依然有效只需换掉导入路径① 构造几何体并求测量值——Circle实现了Measured2d可直接计算面积与周长use bevy_shape::prelude::*; use bevy_math::Vec2; let circle Circle::new(2.0); assert_eq!(circle.area(), std::f32::consts::PI * 4.0); assert_eq!(circle.perimeter(), std::f32::consts::PI * 4.0);参考实现见 dim2.rs。② 生成包围体并做包含测试——Bounded2d已进入 preludeRectangle::aabb_2d、Cuboid::aabb_3d等由各原语实现use bevy_shape::prelude::*; use bevy_math::{Vec2, Vec3}; let rect Rectangle::new(4.0, 2.0); let aabb rect.aabb_2d(Isometry2d::IDENTITY); assert!(aabb.contains(Aabb2d::new(Vec2::ZERO, Vec2::new(1.0, 0.5))));实现层面可参考 bounding/mod.rs 中BoundingVolume::contains等方法的 trait 契约。③ 内缩与描边——Inset/ToRing迁移后照常可用例如把三角形向内缩 0.1 个单位、或把一个圆转成带厚度的Ring实现见 inset.rs 与 dim2.rs 中Ring的定义。④ 形状内随机采样需开启randfeature——ShapeSample可用于粒子系统等场景在形状内部均匀撒点见 sampling/shape_sampling.rs。六、本次迁移的注意事项与边界最后汇总几条容易被忽略的要点bevy::shape路径依旧可用bevy_shape通过 crates/bevy_internal/src/lib.rs#L91 以pub use bevy_shape as shape;挂在bevy下因此像bevy::shape::Circle这类写法在引擎内依旧成立只是底层 crate 归属变成了bevy_shape。二三维原语分层习惯被保留尽管公开路径扁平化了但文档中提到origin is (0, 0) for 2D primitives and (0, 0, 0) for 3D primitives的坐标系约定在 lib.rs 中继续沿用维度语义没有改变。无 std / 少依赖环境友好bevy_shape是#![no_std]crate采样、序列化、反射等功能都通过 feature 门控这在引擎走向更广平台包括嵌入式、WASM 等受限环境的背景下是一个有意的架构调整。改动是否影响现有代码以预导入为准是否“零改动”取决于你用的是引擎级bevy::prelude还是直接依赖bevy_math/bevy_shape前者无需动作后者按上文表格替换导入即可。按照上述清单操作一次原本涉及大量文件、容易出错的“类型搬家”迁移可以被压缩到十几分钟内完成先确认自己的依赖层级再更新Cargo.toml最后用新的bevy_shape路径批量替换旧导入即可让代码库平稳跟上 Bevy 对几何原语归属的新划分。【免费下载链接】bevyA refreshingly simple>项目地址: https://gitcode.com/GitHub_Trending/be/bevy创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考