Closed7

作業メモ:bevy 0.13 → 0.14

hyoihyoi

2024/6/7時点でまだBevy v0.14.0はリリースされていないのでmain branchでマイグレーション

v0.14.0でカラーの扱いが大々的に変更された。複数の色空間と相互変換をサポートしたみたい
リッチになった代償は破壊的変更で、0.13のソースはそのままだとエラー&ワーニングの嵐。

  • カラー定数の扱いが変わった
    • bevy::prelude::Colorの定数が無くなった。(一部は残った)
      残存している定数:Color::NONE, Color::WHITE, Color::BLACK
    • bevy::color::palettes::cssにWEB CSS準拠のカラーがSrgba型で宣言されている
    • 定義されているカラーに変更があった (例:Color::CYANcss::AQUA
  • メソッドが色空間に対応した名前へ変更
    (例:Color::rgba(R,G,B,A)Color::srgba(R,G,B,A)
  • .set_a( alpha ).set_alpha( alpha )に改名
    useする対象も変わったけどuse bevy::prelude::*と書いていたら気付かないかも)
  • bevy::prelude::Color::as_rgba_u32が無くなった(これも色空間の関係かな)。代替にbevy::prelude::LinearRgba::as_u32が使えそう。
0.13
fn main()
{   use bevy::prelude::Color;

    let white = Color::WHITE;
    let red   = Color::RED;
    let cyan  = Color::CYAN;

    let mut transparent = Color::rgba( 1.0, 1.0, 1.0, 0.5 );
    transparent.set_a( 0.1 );

    let color = cyan;
    let color_u32 = color.as_rgba_u32();
}
0.14
fn main()
{   use bevy::prelude::{ Color, Alpha, LinearRgba }; //use bevy::prelude::*; でいいと思う
    use bevy::color::palettes::css;

    let white = Color::WHITE;
    let red   = Color::Srgba( css::RED  );
    let cyan  = Color::Srgba( css::AQUA );

    let blue: Color = css::BLUE.into(); //.into()も実装されている

    let mut transparent = Color::srgba( 1.0, 1.0, 1.0, 0.5 );
    transparent.set_alpha( 0.1 );

    let color = cyan;
    let color_u32 = LinearRgba::from( color ).as_u32();
}

<おまけ>
カラー定数の修正が思いのほか手間だったので、邪道を1つ思いついた。
bevy::prelude::Colorに自前でconstを追加しようという企て。
オーファンルールがあるからtraitを書く必要があるけど、0.13のソースを修正しなくて済む。
一時しのぎにはいい

0.14(一時しのぎ)
fn main()
{   use bevy::prelude::Color;
    use bevy::color::palettes::css;

    //オーファンルール対策用trait
    pub trait ColorConstants
    {   const RED : Color;
        const CYAN: Color;
    }

    //自前でbevy::prelude::Colorへ定数を追加
    impl ColorConstants for bevy::prelude::Color
    {   const RED : Color = Color::Srgba( css::RED  );
        const CYAN: Color = Color::Srgba( css::AQUA ); //名前の変更も吸収できる
    }

    //0.13と同じ書き方になる
    let red  = Color::RED;
    let cyan = Color::CYAN;
}
hyoihyoi

bevy::asset::LoadState::Failedがエラーの原因(Box<bevy::asset::AssetLoadError>)を通知するようになった。エラーの原因に興味がないならパターンマッチに_を使う手がある。

0.13
match asset_server.get_load_state( handle )
{   Some ( LoadState::Failed ) => (),
    _ => (),
}
0.14
match asset_server.get_load_state( handle )
{   Some ( LoadState::Failed ( _ ) ) => (), //エラーの原因を無視していいならこれだけ
    _ => (),
}
hyoihyoi

bevy::window::close_on_esc廃止された。必要なら自分で書くことになる。

0.14
pub fn close_on_esc
(   mut cmds: Commands,
    windows: Query< ( Entity, &Window ) >,
    input: Res< ButtonInput< KeyCode > >,
)
{   for ( id, window ) in windows.iter()
    {   if window.focused && input.just_pressed( KeyCode::Escape )
        {   cmds.entity( id ).despawn();
        }
    }
}
hyoihyoi

TextureAtlasLayout::from_gridの引数の型が変更された。

  • Vec2UVec2
  • usizeu32

スプライトをアニメーションさせていると、地味に影響範囲が広い。

0.13
pub fn from_grid(
    tile_size: Vec2,
    columns: usize,
    rows: usize,
    padding: Option<Vec2>,
    offset: Option<Vec2>
) -> TextureAtlasLayout
0.14
pub fn from_grid(
    tile_size: UVec2,
    columns: u32,
    rows: u32,
    padding: Option<UVec2>,
    offset: Option<UVec2>,
) -> TextureAtlasLayout

そして何故かTextureAtlasの中がpub index: usize,なので、ところどころ型変換が要る…。むぅ。
思うにpub index: u32,でいいのでは…? リリースまでに修正入らんかな。

0.14
pub struct TextureAtlas {
    pub layout: Handle<TextureAtlasLayout>,
    pub index: usize,
}
hyoihyoi

bevy::prelude::SpriteSheetBundleが非推奨になった。そのままだとワーニングがでる。
bevy::prelude::SpriteBundleを使えばいい。

0.13
        cmds.spawn( ( SpriteSheetBundle::default(), player ) )
        .insert( Sprite { custom_size, ..default() } )
        .insert( asset_svr.load( ASSETS_SPRITE_SHEET_PLAYER ) as Handle<Image> )
        .insert( TextureAtlas { layout, index } )
        .insert( Transform::from_translation( translation ) )
        ;
0.14
        cmds.spawn( ( SpriteBundle::default(), player ) )
        .insert( Sprite { custom_size, ..default() } )
        .insert( asset_svr.load( ASSETS_SPRITE_SHEET_PLAYER ) as Handle<Image> )
        .insert( TextureAtlas { layout, index } )
        .insert( Transform::from_translation( translation ) )
        ;
hyoihyoi

公式のリポジトリにrelease-0.14.0のbranchが切られていたので、マイグレ環境をmasterからそっちへ向けた。
今のところ問題ないな…。

Cargo.toml
[workspace.dependencies]
bevy = { git = "https://github.com/bevyengine/bevy", branch = "release-0.14.0" }
#bevy = { git = "https://github.com/bevyengine/bevy" } #Master branch
#bevy = "0.14"
hyoihyoi

気付いたことを追記。
bevy::prelude::Windowのフィールドでv0.13で廃止されたfit_canvas_to_parentがv0.14で復活した。動作は以前と変更なさそう。trueにセットしてアプリをWASM化すると、ブラウザで表示した場合に描画領域(キャンバス)いっぱいにアプリが拡大表示される。

関連するPRは以下にある。

このスクラップは4ヶ月前にクローズされました