#bevy-ui #bevy-plugin #ui-elements #ui #entities #ecs #anchor #points #element #anchoring

bevy_ui_anchor

A small bevy plugin for anchoring UI elements to specific points or entities in the world

15 releases (5 breaking)

0.7.0 May 25, 2025
0.6.1 May 12, 2025
0.6.0 Apr 24, 2025
0.5.1 Mar 20, 2025
0.1.6 Aug 22, 2024

#415 in Game dev

Download history 30/week @ 2025-02-19 44/week @ 2025-02-26 129/week @ 2025-03-05 26/week @ 2025-03-12 170/week @ 2025-03-19 32/week @ 2025-03-26 26/week @ 2025-04-02 26/week @ 2025-04-09 25/week @ 2025-04-16 164/week @ 2025-04-23 18/week @ 2025-04-30 128/week @ 2025-05-07 105/week @ 2025-05-14 144/week @ 2025-05-21 39/week @ 2025-05-28 256/week @ 2025-06-04

603 downloads per month

MIT license

3MB
190 lines

bevy_ui_anchor

crates.io docs.rs License

A Rust crate for anchoring UI elements to specific points or entities in the world using the Bevy game engine.

Features

Provides an AnchorUiNode component that:

  • Anchor UI nodes to world positions or entities.
  • Supports horizontal and vertical anchoring.
  • Compatible with Bevy's ECS architecture.
Bevy version Crate version
0.16 0.6 - 0.7
0.15 0.3 - 0.5
0.14 0.1 - 0.2

Example

//! Demonstrates how to work with Cubic curves.
use bevy::{
    color::palettes::css::{ORANGE, SILVER, WHITE},
    prelude::*,
};

use bevy_ui_anchor::{AnchorPoint, AnchorUiConfig, AnchorUiPlugin, AnchoredUiNodes};

#[derive(Component)]
/// We need a marker for the camera, so the plugin knows which camera to perform position
/// calculations towards
pub struct UiCameraMarker;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        // We need to define, which camera the anchorplugin will be anchored to
        .add_plugins(AnchorUiPlugin::<UiCameraMarker>::new())
        .add_systems(Startup, setup)
        .run();
}

fn setup(
    mut commands: Commands,
    mut meshes: ResMut<Assets<Mesh>>,
    mut materials: ResMut<Assets<StandardMaterial>>,
) {
    // The camera
    commands.spawn((
        // mark it
        UiCameraMarker,
        IsDefaultUiCamera,
        Camera3d::default(),
        Transform::from_xyz(0., 6., 12.).looking_at(Vec3::new(0., 3., 0.), Vec3::Y),
        DirectionalLight::default(),
    ));

    // Spawning a cube with anchored UI, using bevy relations
    commands.spawn((
        Mesh3d(meshes.add(Cuboid::new(0.3, 0.3, 0.3))),
        MeshMaterial3d(materials.add(Color::from(ORANGE))),
        Transform::from_translation([0.0, 0.5, 0.0].into()),
        // Define the anchor relationship
        AnchoredUiNodes::spawn_one((
            AnchorUiConfig {
                anchorpoint: AnchorPoint::bottomleft(),
                offset: Some(Vec3::new(0.0, 0.5, 0.0)),
            },
            Node {
                border: UiRect::all(Val::Px(2.)),
                ..Default::default()
            },
            BorderColor(WHITE.into()),
            BorderRadius::all(Val::Px(2.)),
            Outline::default(),
            Children::spawn_one(
                // text
                Text("Text Anchored in bottom left".into()),
            ),
        )),
    ));

    // ground plane
    commands.spawn((
        Mesh3d(meshes.add(Plane3d::default().mesh().size(50., 50.))),
        MeshMaterial3d(materials.add(Color::from(SILVER))),
    ));
}

Dependencies

~58–90MB
~1.5M SLoC