多态效果 提高复用

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)
      }
}

注释里说明了数据表达式是一个梯形,两个斜边就是淡入淡出的时长和淡化效果.