Closed20

作業メモ:bevy 0.12 → 0.13

hyoihyoi

2024/2/8時点でまだBevy v0.13.0はリリースされていないので、main branchでマイグレーションする。

カメラ周りの変更。

  • ClearColorConfigbevy::core_pipeline::clear_colorからbevy::render::cameraへ移った。
  • Camera2dCamera3dのフィールドだったclear_colorCameraのフィールドになった。
  • UiCameraConfigが無くなった。PR #10559のChangelog参照。
0.12
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非表示
    ;
0.13
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では崩れない。
hyoihyoi

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>
hyoihyoi

bevy::text::Textのフィールドalignment: TextAlignmentjustify: JustifyTextへ変更。

0.12
let sections  = vec![ TextSection { value, style } ];
let alignment = TextAlignment::Center;

cmds.spawn( Text2dBundle::default() )
    .insert( Text { sections, alignment, ..default() } )
    ;
0.13
let sections  = vec![ TextSection { value, style } ];
let justify = JustifyText::Center;

cmds.spawn( Text2dBundle::default() )
    .insert( Text { sections, justify, ..default() } )
    ;
hyoihyoi

bevy::ecs::schedule::common_conditionsの指定の仕方が変わった。
末尾の「()」が要らなくなった。

0.12
.run_if( not( state_exists::<MyState>() ) )
.run_if( resource_exists::<IsLoadingFinished>() ) 
0.13
.run_if( not( state_exists::<MyState> ) )
.run_if( resource_exists::<IsLoadingFinished> ) 
hyoihyoi

Assets<T>.add()の引数で.into()が要らなくなった。

0.12
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() ) )
    ;
}
0.13
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) )
    ;
}
hyoihyoi

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

hyoihyoi

app.add_state()init.add_state()へ改名。

012
    app.add_state::<MyState>();
0.13
    app.init_state::<MyState>();
hyoihyoi

bevy::diagnostic::DiagnosticsStore.get()の引数が参照に変わった。

0.12
fn update_fps( diag_store: Res<DiagnosticsStore> )
{   let fps_avr = diag_store
        .get( FrameTimeDiagnosticsPlugin::FPS )
//(後略)
0.13
fn update_fps( diag_store: Res<DiagnosticsStore> )
{   let fps_avr = diag_store
        .get( &FrameTimeDiagnosticsPlugin::FPS )
//(後略)
hyoihyoi

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()
0.12
fn despawn<T: Component>
(   qry_entity: Query<Entity, With<T>>,
    mut cmds: Commands,
)
{   qry_entity.for_each( | id | cmds.entity( id ).despawn_recursive() );
}
0.13
fn despawn<T: Component>
(   qry_entity: Query<Entity, With<T>>,
    mut cmds: Commands,
)
{   qry_entity.iter().for_each( | id | cmds.entity( id ).despawn_recursive() );
}
hyoihyoi

bevy::window::Windowpub fit_canvas_to_parent: bool,フィールドが無くなった。
代替手段はPR #11057のMigration Guideを参照。

hyoihyoi

VolumeLevelが無くなった。PR #11092を参照。

0.12
use bevy::audio::{ Volume, VolumeLevel };
let volume = Volume::Relative ( VolumeLevel::new( 0.1 ) );
0.13
use bevy::audio::Volume;
let volume = Volume::new( 0.1 );
hyoihyoi

shapeを作る方法が変わった。以前の方法はwarningが表示される。
なんか0.12以前の方が見た目シンプルな気が‥‥ ( ̄▽ ̄;) メソッドとかよく分からない。
0.13正式リリースされたら公式ドキュメントで調べなおそう。

0.12
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 );
0.13
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 );
hyoihyoi

Texture Atlas rework #5103でややこしい破壊的変更がありスプライトのアニメーション処理に影響がでる。(参照先によるとUIも影響を受けるようだ)

  • bevy::sprite::TextureAtlasSpriteが無くなった。
    • フィールドpub index: usize,の引っ越し先は0.13で登場した新しいTextureAtlas
    • 他のフィールドの引っ越し先はbevy::sprite::Spriteの中。
0.12
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とは別物)
0.13
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,
}

ややこしい‥‥

hyoihyoi

bevy::hierarchy::ChildBuilderの定義(LIFE TIME)が変わった?
(こんなの、何か凝ったことをしなければ、普通はお世話にならないか)

0.12
pub struct ChildBuilder<'w, 's, 'a> { /* private fields */ }
0.13
pub struct ChildBuilder<'a> { /* private fields */ }
hyoihyoi

Query型の書き方に制限が入った。Issue#7680で問題提起された件。
Query型はQuery<Data,Filter>と書けるが(DataはComponetでFilterはWith<T>Or<T>)、これまではDataとFilterは両方ともにWorldQueryトレイトを実装しているだけで実質的な区別がなかった。それを利用して0.12以前は以下のように書けた。しかし0.13ではエラーになる。

0.12
#[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トレイトがQueryDataQueryFilterに分割されたこと。今後は厳密に区別される。上記はFilterのWith<T>で置き換えられる。

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<( 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;
}
hyoihyoi

未解決の問題(2024/2/13現在)

現時点での不具合メモ。まだ0.13正式リリース前なので様子見。

  1. Cameraclear_color: ClearColorConfig::Noneが期待通りに透過しないことがある。
  2. Cameraviewportを設定してWindowModeSizedFullscreenへ切り替えると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)
hyoihyoi

v0.13リリース(2024/2/18)

main branch から v0.13.0 へ切り替えたが、1つ上で書いた未解決問題はそのままだった。
本腰入れて調べてみよう。
(ちょっとだけv0.13.1で解消しないかな?と淡い期待もあったりして‥‥ (^_^; )

hyoihyoi

Cameraviewportを設定してWindowModeSizedFullscreenへ変更するとpanicする件

手元のPCだとウィンドウの幅が1366Pxだと問題なくて、1376PxだとPanicする。
下のソースコードで再現性がある。
どうもSizedFullscreenへ切り替えるとresolutionの横幅がウィンドウ時より狭くなり、Cameraにセット済みのviewportが範囲外アクセスになってしまうようだ。そうなるとgfx-rs/wgpuのPR#4058で追加されたwgpuのチェックでValidation Errorにされるっぽい。
自分では治せなさそうだな‥‥。(2024/02/20 bevy公式にIssue#12000を登録した)

v0.13.0
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,
        };
    }
}
hyoihyoi

Cameraclear_color: ClearColorConfig::Noneが期待通りに透過しないことがある件

v0.13.0リリース後のmain branchで解消していることを確認した。(2024/02/21)
おそらくバグフィックス版のv.0.13.1で問題なくなる。

hyoihyoi

以前 bevy公式にIssueを立てたヤツ、他の人が治してくれてPRが出てました! OSS万歳!
チェックもクリアしてるようだし早々にマージされそう。うれしい (^_^)
PR#12861

このスクラップは2024/04/05にクローズされました