Panic with headless build
Closed this issue · 2 comments
Description:
Bevy provides a MinimalPlugins
plugin bundle for headless bevy applications. Headless applications can be used to implement a game server for example. When trying to add the default Avian PhysicsPlugins
Plugin Bundle Bevy a panics.
Minimal Example:
Here is a minimal example for a simple headless bevy application.
use avian3d::prelude::*;
use bevy::{app::ScheduleRunnerPlugin, prelude::*};
fn main() {
App::new()
.add_plugins(MinimalPlugins.set(ScheduleRunnerPlugin::run_once()))
.add_systems(Update, hello_world_system)
.add_plugins(PhysicsPlugins::default())
.run();
}
fn hello_world_system() {
println!("hello world");
}
Which results in the following error.
Resource requested by avian3d::collision::collider::backend::init_collider_constructor_hie
rarchies does not exist: bevy_asset::assets::Assets<bevy_render::mesh::mesh::Mesh>
Encountered a panic in system `hello world
avian3d::collision::collider::backend::init_collider_constructors`!
Encountered a panic in system `avian3d::collision::collider::backend::init_collider_constr
uctor_hierarchies`!
Encountered a panic in system `bevy_app::main_schedule::Main::run_main`!
Is this a bug?
Does PhysicsPlugins::default()
include plugins that can not be used without bevy_window::WindowPlugin
maybe? If yes, would it make sense to also provide a MinimalPlugins
bundle for avian physics? What plugins would I need to exclude?
Thanks!
The panics do not seem to be related to WindowPlugin.
Info for you and anyone else who lands here trying to do the same in the future:
There's a few things missing when launching with MinimalPlugins
that cause a panic:
AssetPlugin
ScenePlugin
Assets<Mesh> resource
Also missing but doesn't cause a panic:
TransformPlugin
These requirements are implicitly codified in tests.rs::create_app here, but this information isn't easy to find.
With the following changes I was able to get your code above running:
fn main() {
App::new()
.add_plugins(MinimalPlugins.set(ScheduleRunnerPlugin::run_once()))
+ .add_plugins((
+ TransformPlugin,
+ bevy::asset::AssetPlugin::default(),
+ bevy::scene::ScenePlugin,
+ ))
+ .init_resource::<Assets<Mesh>>()
.add_systems(Update, hello_world_system)
.add_plugins(PhysicsPlugins::default())
.run();
}
If you don't need mesh colliders, you can avoid the need for Assets<Mesh>
resource and ScenePlugin
if you disable the bevy_scene
and collider-from-mesh
features.
I don't see a way that it could be possible to remove the reliance on TransformPlugin since so much of Avian works with GlobalTransform.
I see, thanks a lot!