多态效果 提高复用
OO中的多态是子类各有各的逻辑,调用时用父类类型但传入子类, 保障代码简约的同时大大提高扩展性,是OO的三大基本特征之一.
在下面的代码,使用两个特型就模拟出了类似的效果.
特型Spawn实体生成器有两个实现: EntityCommands普通实体生成器和RelatedSpawnerCommands关系实体生成器.
这里核心是实体生成器Spawn可以生成挂件Widgets.
不管是挂件还是实体生成器都是特型,后期就算新增了其他的实体生成器,这块的代码都不用修改,灵活.
Use+as 只要实现不要特型
#[allow(unused_imports)]
pub mod prelude {
pub use super::{
interaction::InteractionPalette,
palette as ui_palette,
widgets::{Containers as _, Widgets as _},
};
}
这个Containers是一个特型.
淡入淡出的时间控制
#[derive(Component, Reflect)]
#[reflect(Component)]
struct ImageNodeFadeInOut {
/// Total duration in seconds.
total_duration: f32,
/// Fade duration in seconds.
fade_duration: f32,
/// Current progress in seconds, between 0 and [`Self::total_duration`].
t: f32,
}
impl ImageNodeFadeInOut {
fn alpha(&self) -> f32 {
// Normalize by duration.
let t = (self.t / self.total_duration).clamp(0.0, 1.0);
let fade = self.fade_duration / self.total_duration;
// Regular trapezoid-shaped graph, flat at the top with alpha = 1.0.
((1.0 - (2.0 * t - 1.0).abs()) / fade).min(1.0)
}
}
注释里说明了数据表达式是一个梯形,两个斜边就是淡入淡出的时长和淡化效果.