作業メモ:bevy 0.12 → 0.13
2024/2/8時点でまだBevy v0.13.0はリリースされていないので、main branchでマイグレーションする。
カメラ周りの変更。
-
ClearColorConfig
がbevy::core_pipeline::clear_color
からbevy::render::camera
へ移った。 -
Camera2d
とCamera3d
のフィールドだったclear_color
がCamera
のフィールドになった。 -
UiCameraConfig
が無くなった。PR #10559のChangelog参照。
use bevy::core_pipeline::clear_color::ClearColorConfig;
cmds.spawn( Camera2dBundle::default() )
.insert( Camera2d { clear_color: ClearColorConfig::None } )
.insert( UiCameraConfig { show_ui: true } ) //UI表示
;
cmds.spawn( Camera3dBundle:: default() )
.insert( Camera3d { clear_color: ClearColorConfig::None, ..default() } )
.insert( UiCameraConfig { show_ui: false } ) //UI非表示
;
use bevy::render::camera::ClearColorConfig;
cmds.spawn( Camera2dBundle::default() )
.insert( Camera { clear_color: ClearColorConfig::None, ..default() } )
;
cmds.spawn( Camera3dBundle:: default() )
.insert( Camera { clear_color: ClearColorConfig::None, ..default() } )
;
<おまけ>
- UIノードの描画が2D/3Dカメラのviewportに追従するよう改良された。最大化ボタン等でウィンドウサイズが変化した場合、以前は2D/3D表示とUIの表示が乖離したが、0.13では崩れない。
Enum bevy::input::keyboard::KeyCode
に変更があった。
0.12 | 0.13 |
---|---|
KeyCode::Return | KeyCode::Enter |
KeyCode::Up | KeyCode::ArrowUp |
KeyCode::Down | KeyCode::ArrowDown |
KeyCode::Left | KeyCode::ArrowLeft |
KeyCode::Right | KeyCode::ArrowRight |
KeyCode::Z | KeyCode::KeyZ |
KeyCode::X | KeyCode::KeyX |
etc... |
Input<T>
の名前が変わった。
-
Input<KeyCode>
→ButtonInput<KeyCode>
-
Input<MouseButton>
→ButtonInput<MouseButton>
-
Input<GamepadButton>
→ButtonInput<GamepadButton>
bevy::text::Text
のフィールドalignment: TextAlignment
がjustify: JustifyText
へ変更。
let sections = vec![ TextSection { value, style } ];
let alignment = TextAlignment::Center;
cmds.spawn( Text2dBundle::default() )
.insert( Text { sections, alignment, ..default() } )
;
let sections = vec![ TextSection { value, style } ];
let justify = JustifyText::Center;
cmds.spawn( Text2dBundle::default() )
.insert( Text { sections, justify, ..default() } )
;
bevy::ecs::schedule::common_conditions
の指定の仕方が変わった。
末尾の「()」が要らなくなった。
.run_if( not( state_exists::<MyState>() ) )
.run_if( resource_exists::<IsLoadingFinished>() )
.run_if( not( state_exists::<MyState> ) )
.run_if( resource_exists::<IsLoadingFinished> )
Assets<T>
の.add()
の引数で.into()
が要らなくなった。
pub fn spawn_3d_objects
( mut cmds: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
)
{ //立方体
cmds.spawn( PbrBundle::default() )
.insert( meshes.add( shape::Cube::new( 1.0 ).into() ) )
.insert( Transform::from_translation( Vec3::ZERO ) )
.insert( materials.add( Color::BISQUE.into() ) )
;
//地面
cmds.spawn( PbrBundle::default() )
.insert( meshes.add( shape::Plane::from_size( 5.0 ).into() ) )
.insert( Transform::from_translation( Vec3::Y / -2.0 ) )
.insert( materials.add( Color::SEA_GREEN.into() ) )
;
}
pub fn spawn_3d_objects
( mut cmds: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
)
{ //立方体
cmds.spawn( PbrBundle::default() )
.insert( meshes.add( shape::Cube::new( 1.0 ) ) )
.insert( Transform::from_translation( Vec3::ZERO ) )
.insert( materials.add( Color::BISQUE ) )
;
//地面
cmds.spawn( PbrBundle::default() )
.insert( meshes.add( shape::Plane::from_size( 5.0 ) ) )
.insert( Transform::from_translation( Vec3::Y / -2.0 ) )
.insert( materials.add( Color::SEA_GREEN) )
;
}
bevy::pbr::DirectionalLight
のフィールドilluminance
(照度)が変更されている。PR#11581参照。
0.12で15000.0だった設定値を、0.13では 800.0~1000.0 2000.0~3000.0程度に下げないと明るすぎて色が飛ぶ。(2024/2/16にbevy main branchの変更を確認し訂正)
illuminance: 15000.0
illuminance: 800.0 → 2000.0
app.add_state()
がinit.add_state()
へ改名。
app.add_state::<MyState>();
app.init_state::<MyState>();
bevy::diagnostic::DiagnosticsStore
の.get()
の引数が参照に変わった。
fn update_fps( diag_store: Res<DiagnosticsStore> )
{ let fps_avr = diag_store
.get( FrameTimeDiagnosticsPlugin::FPS )
//(後略)
fn update_fps( diag_store: Res<DiagnosticsStore> )
{ let fps_avr = diag_store
.get( &FrameTimeDiagnosticsPlugin::FPS )
//(後略)
Query
に対して使う.for_each()
と.for_each_mut()
が非推奨になった(warning表示)。
v0.14.0で削除されるようだ。PR #6773のChangelog参照。
-
query.for_each()
→query.iter().for_each()
-
query.for_each_mut()
→query.iter_mut().for_each()
fn despawn<T: Component>
( qry_entity: Query<Entity, With<T>>,
mut cmds: Commands,
)
{ qry_entity.for_each( | id | cmds.entity( id ).despawn_recursive() );
}
fn despawn<T: Component>
( qry_entity: Query<Entity, With<T>>,
mut cmds: Commands,
)
{ qry_entity.iter().for_each( | id | cmds.entity( id ).despawn_recursive() );
}
bevy::window::Window
のpub fit_canvas_to_parent: bool,
フィールドが無くなった。
代替手段はPR #11057のMigration Guideを参照。
VolumeLevel
が無くなった。PR #11092を参照。
use bevy::audio::{ Volume, VolumeLevel };
let volume = Volume::Relative ( VolumeLevel::new( 0.1 ) );
use bevy::audio::Volume;
let volume = Volume::new( 0.1 );
shapeを作る方法が変わった。以前の方法はwarningが表示される。
なんか0.12以前の方が見た目シンプルな気が‥‥ ( ̄▽ ̄;) メソッドとかよく分からない。
0.13正式リリースされたら公式ドキュメントで調べなおそう。
let circle = shape::Circle::new( radius );
let triangle = shape::RegularPolygon::new( radius, 3 );
let cube3d = shape::Cube::new( 1.0 );
let plane3d = shape::Plane::from_size( 5.0 );
let circle2d = Circle::new( radius ).mesh().resolution( 64 ).build();
let triangle2d = RegularPolygon::new( radius, 3 ).mesh();
let cube3d = Cuboid::default();
let plane3d = Plane3d::default().mesh().size( 5.0, 5.0 );
Texture Atlas rework #5103でややこしい破壊的変更がありスプライトのアニメーション処理に影響がでる。(参照先によるとUIも影響を受けるようだ)
-
bevy::sprite::TextureAtlasSprite
が無くなった。- フィールド
pub index: usize,
の引っ越し先は0.13で登場した新しいTextureAtlas
。 - 他のフィールドの引っ越し先は
bevy::sprite::Sprite
の中。
- フィールド
pub struct TextureAtlasSprite {
pub color: Color,
pub index: usize, //これだけ新TextureAtlasに引っ越す。他はSpriteへ
pub flip_x: bool,
pub flip_y: bool,
pub custom_size: Option<Vec2>,
pub anchor: Anchor,
}
pub struct Sprite { //0.13でも中身は変わらない
pub color: Color,
pub flip_x: bool,
pub flip_y: bool,
pub custom_size: Option<Vec2>,
pub rect: Option<Rect>,
pub anchor: Anchor,
}
- 元々あった
bevy::sprite::TextureAtlas
は0.13でTextureAtlasLayout
に改名された。- フィールド
pub texture: Handle<Image>,
が削除された。引っ越し先はbevy::sprite::SpriteBundle
に元々あったpub texture: Handle<Image>,
。 - この影響で
from_grid()
の引数が1つ減った。(texture相当の引数が無くなった)
- フィールド
- 0.13で新たに
TextureAtlas
が追加された。(上述のとおり以前のTextureAtlas
とは別物)
pub struct TextureAtlasLayout { //改名された旧TextureAtlas
//pub texture: Handle<Image>, が削除
pub size: Vec2,
pub textures: Vec<Rect>,
/* private fields */
}
pub struct TextureAtlas { //新設
pub layout: Handle<TextureAtlasLayout>,
pub index: usize, //ここがindexの新居
}
pub struct SpriteSheetBundle {
pub sprite: Sprite, //TextureAtlasSpriteのindex以外の引っ越し先
pub transform: Transform,
pub global_transform: GlobalTransform,
pub texture: Handle<Image>, //Handle<Image>の引っ越し先
pub atlas: TextureAtlas, //追加された新TextureAtlas
pub visibility: Visibility,
pub inherited_visibility: InheritedVisibility,
pub view_visibility: ViewVisibility,
}
ややこしい‥‥
bevy::hierarchy::ChildBuilder
の定義(LIFE TIME)が変わった?
(こんなの、何か凝ったことをしなければ、普通はお世話にならないか)
pub struct ChildBuilder<'w, 's, 'a> { /* private fields */ }
pub struct ChildBuilder<'a> { /* private fields */ }
Query
型の書き方に制限が入った。Issue#7680で問題提起された件。
Query
型はQuery<Data,Filter>と書けるが(DataはComponetでFilterはWith<T>
やOr<T>
)、これまではDataとFilterは両方ともにWorldQuery
トレイトを実装しているだけで実質的な区別がなかった。それを利用して0.12以前は以下のように書けた。しかし0.13ではエラーになる。
#[derive( Component )] pub struct FppCamera;
#[derive( Component )] pub struct TppCamera;
fn switch_fpp_tpp_cameras
( mut qry_fpp_tpp: Query<&mut Camera, Or<( &FppCamera, &TppCamera )>>, //これが
)
{ qry_fpp_tpp.for_each_mut( | mut camera | camera.is_active = ! camera.is_active );
}
エラーの原因はWorldQuery
トレイトがQueryData
とQueryFilter
に分割されたこと。今後は厳密に区別される。上記はFilterのWith<T>
で置き換えられる。
#[derive( Component )] pub struct FppCamera;
#[derive( Component )] pub struct TppCamera;
fn switch_fpp_tpp_cameras
( mut qry_fpp_tpp: Query<&mut Camera, Or<( With<FppCamera>, With<TppCamera> )>>, //こう
)
{ qry_fpp_tpp.iter_mut().for_each( | mut camera | camera.is_active = ! camera.is_active );
}
<余談>
Queryを分けて書き直すとParamSet
が必要になるので面倒くさい‥‥ _(:3 」∠)_
#[derive( Component )] pub struct FppCamera;
#[derive( Component )] pub struct TppCamera;
fn switch_fpp_tpp_cameras
( mut param_set: ParamSet
<( Query<&mut Camera, With<FppCamera>>,
Query<&mut Camera, With<TppCamera>>,
)>,
)
{ let mut qry_fpp = param_set.p0();
let Ok ( mut fpp ) = qry_fpp.get_single_mut() else { return };
fpp.is_active = ! fpp.is_active;
let mut qry_tpp = param_set.p1();
let Ok ( mut tpp ) = qry_tpp.get_single_mut() else { return };
tpp.is_active = ! tpp.is_active;
}
未解決の問題(2024/2/13現在)
現時点での不具合メモ。まだ0.13正式リリース前なので様子見。
-
Camera
のclear_color: ClearColorConfig::None
が期待通りに透過しないことがある。 -
Camera
にviewport
を設定してWindowMode
をSizedFullscreen
へ切り替えるとpanicする場合がある(0.12.1ではpanicしなかった)。矩形の指定方法が悪いとか‥‥?
2024-02-13T12:16:26.664379Z ERROR log: Handling wgpu errors as fatal by default
thread 'Compute Task Pool (2)' panicked at C:\Users\hyoi\.cargo\registry\src\index.crates.io-6f17d22bba15001f\wgpu-0.19.1\src\backend\wgpu_core.rs:3009:5:
wgpu error: Validation Error
Caused by:
In a RenderPass
note: encoder = `main_opaque_pass_3d_command_encoder`
In a set_viewport command
Viewport has invalid rect Rect { x: 0.0, y: 0.0, w: 1376.0, h: 768.0 }; origin and/or size is less than or equal to 0, and/or is not contained in the render target (1366, 768, 1)
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
Encountered a panic in exclusive system `bevy_render::renderer::render_system`!
thread 'Compute Task Pool (2)' panicked at C:\Users\hyoi\.cargo\git\checkouts\bevy-f7ffde730c324c74\f1f83bf\crates\bevy_render\src\pipelined_rendering.rs:49:67:
called `Result::unwrap()` on an `Err` value: RecvError
error: process didn't exit successfully: `target\debug\my_bevyapp_template.exe` (exit code: 101)
v0.13リリース(2024/2/18)
main branch から v0.13.0 へ切り替えたが、1つ上で書いた未解決問題はそのままだった。
本腰入れて調べてみよう。
(ちょっとだけv0.13.1で解消しないかな?と淡い期待もあったりして‥‥ (^_^; )
Camera
にviewport
を設定してWindowMode
をSizedFullscreen
へ変更するとpanicする件
手元のPCだとウィンドウの幅が1366Pxだと問題なくて、1376PxだとPanicする。
下のソースコードで再現性がある。
どうもSizedFullscreen
へ切り替えるとresolution
の横幅がウィンドウ時より狭くなり、Camera
にセット済みのviewport
が範囲外アクセスになってしまうようだ。そうなるとgfx-rs/wgpuのPR#4058で追加されたwgpuのチェックでValidation Errorにされるっぽい。
自分では治せなさそうだな‥‥。(2024/02/20 bevy公式にIssue#12000を登録した)
use bevy::
{ prelude::*,
render::camera::Viewport,
window::WindowMode,
};
// const WINDOW_WIDTH : f32 = 1366.0; //OK
const WINDOW_WIDTH : f32 = 1376.0; //Panic: Viewport has invalid rect
const WINDOW_HEIGHT: f32 = 768.0;
fn main()
{ //Specify Window Size.
let window = Window { resolution: ( WINDOW_WIDTH, WINDOW_HEIGHT ).into(), ..default() };
let primary_window = Some ( window );
App::new()
.add_plugins( DefaultPlugins.set( WindowPlugin { primary_window, ..default() } ) )
.add_systems( Startup, startup )
.add_systems( Update, toggle_window_mode )
.run();
}
fn startup( mut cmds: Commands )
{ //Match viewport to Window size.
let physical_position = UVec2::new( 0, 0 );
let physical_size = Vec2::new( WINDOW_WIDTH, WINDOW_HEIGHT ).as_uvec2();
let viewport = Some ( Viewport { physical_position, physical_size, ..default() } );
cmds.spawn( Camera2dBundle::default() ).insert( Camera { viewport, ..default() } );
}
fn toggle_window_mode
( mut qry_window: Query<&mut Window>,
inkey: Res<ButtonInput<KeyCode>>,
)
{ let Ok( mut window ) = qry_window.get_single_mut() else { return };
//Use the [SPACE] key to toggle between window and full screen.
if inkey.just_pressed( KeyCode::Space )
{ window.mode = match window.mode
{ WindowMode::Windowed => WindowMode::SizedFullscreen,
_ => WindowMode::Windowed,
};
}
}
Camera
のclear_color: ClearColorConfig::None
が期待通りに透過しないことがある件
v0.13.0リリース後のmain branchで解消していることを確認した。(2024/02/21)
おそらくバグフィックス版のv.0.13.1で問題なくなる。