作業メモ:bevy 0.13 → 0.14
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::CYAN
→css::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
が使えそう。
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();
}
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のソースを修正しなくて済む。
一時しのぎにはいい
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;
}
bevy::asset::LoadState::Failed
がエラーの原因(Box<bevy::asset::AssetLoadError>
)を通知するようになった。エラーの原因に興味がないならパターンマッチに_
を使う手がある。
match asset_server.get_load_state( handle )
{ Some ( LoadState::Failed ) => (),
_ => (),
}
match asset_server.get_load_state( handle )
{ Some ( LoadState::Failed ( _ ) ) => (), //エラーの原因を無視していいならこれだけ
_ => (),
}
bevy::window::close_on_esc
が廃止された。必要なら自分で書くことになる。
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();
}
}
}
TextureAtlasLayout::from_grid
の引数の型が変更された。
-
Vec2
→UVec2
-
usize
→u32
スプライトをアニメーションさせていると、地味に影響範囲が広い。
pub fn from_grid(
tile_size: Vec2,
columns: usize,
rows: usize,
padding: Option<Vec2>,
offset: Option<Vec2>
) -> TextureAtlasLayout
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,
でいいのでは…? リリースまでに修正入らんかな。
pub struct TextureAtlas {
pub layout: Handle<TextureAtlasLayout>,
pub index: usize,
}
bevy::prelude::SpriteSheetBundle
が非推奨になった。そのままだとワーニングがでる。
bevy::prelude::SpriteBundle
を使えばいい。
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 ) )
;
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 ) )
;
公式のリポジトリにrelease-0.14.0のbranchが切られていたので、マイグレ環境をmasterからそっちへ向けた。
今のところ問題ないな…。
[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"
気付いたことを追記。
bevy::prelude::Window
のフィールドでv0.13で廃止されたfit_canvas_to_parent
がv0.14で復活した。動作は以前と変更なさそう。true
にセットしてアプリをWASM化すると、ブラウザで表示した場合に描画領域(キャンバス)いっぱいにアプリが拡大表示される。
関連するPRは以下にある。