Tnua - Bevy的角色控制器
Tnua(希伯来语中的"运动")是一个浮动角色控制器,这意味着角色不是一直接触地面,而是浮在地面上方,这使得许多运动控制方面变得更简单。
Tnua可以使用Rapier或Avian(前身为XPBD),并通过集成crate支持两者的2D和3D版本:
- 对于Rapier 2D,添加bevy-tnua-rapier2d crate。
- 对于Rapier 3D,添加bevy-tnua-rapier3d crate。
- 对于Avian 2D,添加bevy-tnua-avian2d crate。
- 对于Avian 3D,添加bevy-tnua-avian3d crate。
- XPBD仍然通过bevy-tnua-xpbd2d和bevy-tnua-xpbd3d支持,但鼓励用户迁移到Avian
- 第三方集成crate。这些crate应该依赖于bevy-tnua-physics-integration-layer,而不是主bevy-tnua crate。
注意:
- 同时需要集成crate(
bevy-tnua-<physics-backend>
)和主bevy-tnua
crate,并且两个crate的主插件都应该被添加。 - 如果你使用带有双精度的物理后端(如带有
f64
标志的Avian),你需要为所有Tnua crate添加f64
标志。这适用于由物理后端定义的双精度数据 - Bevy本身仍将使用单精度,这是位置和旋转将使用的精度。
功能
- 支持Rapier和Avian的2D和3D版本
- 奔跑
- 跳跃
- 蹲伏
- 可变高度跳跃
- 土狼时间
- 跳跃缓冲
- 上下坡/楼梯奔跑
- 倾斜校正
- 移动平台
- 旋转平台
- 动画辅助(不是动画本身,但Tnua有帮助决定播放哪个动画的功能)
- 跳跃/穿过平台
- 空中动作
演示:
- 2D平台游戏: Rapier, Avian, Avian(f64版本)
- 3D平台游戏: Rapier, Avian, Avian(f64版本)
- 3D射击游戏: Rapier, Avian, Avian(f64版本)
演示中的基础和动作可以通过GUI进行调整。它们初始化为Tnua提供的Default::default()
,但有以下例外:
TnuaBuiltinWalk::desired_velocity
默认为零向量,但当用户控制角色行走时,它被设置为长度为20.0的向量(在2D演示中为40.0)TnuaBuiltinWalk::float_height
被设置为2.0,尽管它默认为0.0。用户代码应始终根据模型的几何特性设置浮动高度。TnuaBuiltinWalk::max_slope
被设置为$\frac{\pi}{4}$,尽管它默认为$\frac{\pi}{2}$(这会禁用滑动行为,因为这是墙壁的斜率角度)TnuaBuiltinJump::height
被设置为4.0,尽管它默认为0.0。用户代码应始终根据游戏需求设置跳跃高度(零高度的跳跃动作是无用的)TnuaBuiltinCrouch::float_offset
被设置为-0.9,尽管它默认为0.0。就像float_height
一样,这个值应该始终由用户代码根据模型的几何特性设置。TnuaBuiltinDash::displacement
默认为0.0,但当用户输入冲刺命令时,它被设置为长度为10.0的向量。
本地运行演示
$ cargo run --bin <demo-name> --features <physics-backend>
其中<demo-name>
是演示的名称,<physics-backend>
是rapier2d
、rapier3d
、avian2d
或avian3d
之一。确保后端的维度(2D或3D)与演示相匹配。例如,要使用Avian运行3D平台游戏,请使用以下命令:
$ cargo run --bin platformer_3d --features avian3d
演示代码中的有趣部分
(注意:示例比演示更简单,所以如果有示例展示某些内容,阅读那些会更容易)
版本
Tnua被拆分为不同的独立更新的crate,因此这里分为多个表格。bevy-tnua-physics-integration-layer的版本必须与主要的bevy-tnua crate和集成crate保持一致。
主要
bevy | bevy-tnua-physics-integration-layer | bevy-tnua |
---|---|---|
0.14 | 0.4 | 0.19 |
0.13 | 0.3 | 0.16-0.18 |
0.13 | 0.2 | 0.15 |
0.12 | 0.1 | 0.13-0.14 |
Rapier集成
bevy | bevy-tnua-physics-integration-layer | bevy-tnua-rapier | bevy_rapier |
---|---|---|---|
0.14 | 0.4 | 0.7 | 0.27 |
0.13 | 0.3 | 0.6 | 0.26 |
0.13 | 0.3 | 0.4, 0.5 | 0.25 |
0.13 | 0.2 | 0.3 | 0.25 |
0.12 | 0.1 | 0.2 | 0.24 |
0.12 | 0.1 | 0.1 | 0.23 |
Avian集成
bevy | bevy-tnua-physics-integration-layer | bevy-tnua-avian | avian |
---|---|---|---|
0.14 | 0.4 | 0.1 | 0.1 |
XPBD集成
由于bevy_xpbd项目已更名为"Avian",此集成将不再接收任何更新。
bevy | bevy-tnua-physics-integration-layer | bevy-tnua-xpbd | bevy_xpbd |
---|---|---|---|
0.14 | 0.4 | 0.5 | 0.5 |
0.13 | 0.3 | 0.3, 0.4 | 0.4 |
0.13 | 0.2 | 0.2 | 0.4 |
0.12 | 0.1 | 0.1 | 0.3 |
分拆前
bevy | bevy-tnua | bevy_rapier |
---|---|---|
0.12 | 0.12 | 0.23 |
0.11 | 0.8 - 0.11 | 0.22 |
0.10 | 0.1 - 0.7 | 0.21 |
参考资料
Tnua的数学和物理编码参考了以下资料:
- "浮动胶囊"和奔跑机制:
- 跳跃机制:
替代方案
- bevy_mod_wanderlust - 这个模组最初启发了本项目,我也是从这里得到浮动胶囊视频的。我最终创建了自己的插件,因为bevy_mod_wanderlust不支持2D。
- Rapier本身有一个角色控制器。它不是浮动角色控制器,但它与物理引擎本身集成,利用这一优势解决了一些使用浮动模型所要解决的问题。
许可证
根据您的选择,可以使用以下任一许可:
- Apache许可证2.0版(LICENSE-APACHE或http://www.apache.org/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT或http://opensource.org/licenses/MIT)
贡献
除非您另有明确声明,否则您有意提交以包含在作品中的任何贡献,按照Apache-2.0许可证的定义,均应按上述方式双重许可,无需任何额外条款或条件。