#path-finding #navigation #bevy #game #avoidance #game-ai #landmass

bevy_landmass

Bevy的插件,用于处理AI角色的导航

8个版本 (重大更新)

0.7.0 2024年7月23日
0.6.0 2024年7月6日
0.5.0 2024年2月18日
0.4.1 2024年1月14日
0.1.0 2023年6月26日

#292 in 游戏开发

Download history 5/week @ 2024-06-02 94/week @ 2024-06-30 60/week @ 2024-07-07 2/week @ 2024-07-14 173/week @ 2024-07-21 108/week @ 2024-07-28 8/week @ 2024-08-04

每月291次下载
landmass_oxidized_navigat…中使用

MIT/Apache

430KB
12K SLoC

bevy_landmass

Bevy的插件,方便使用landmass

概述

bevy_landmass允许使用导航网格来确定使用路径查找的角色所需的移动方向。

要使用bevy_landmass

  1. LandmassPlugin添加到您的应用程序中。
  2. 创建一个具有Archipelago组件的实体。
  3. 创建一个具有IslandBundleTransformBundle(或任何包含TransformGlobalTransform的捆绑包)和IslandNavMesh组件的实体。
  4. 创建具有AgentBundleTransformBundle(或任何包含TransformGlobalTransform的捆绑包)的实体。

请注意,Archipelago可以在代理/岛屿已经具有对它的ArchipelagoRef引用之后创建。代理/岛屿将在Archipelago存在后添加。

示例

use std::sync::Arc;

use bevy::{app::AppExit, prelude::*};
use bevy_landmass::prelude::*;

fn main() {
  App::new()
    .add_plugins(MinimalPlugins)
    .add_plugins(AssetPlugin::default())
    .add_plugins(TransformPlugin)
    .add_plugins(Landmass2dPlugin::default())
    .add_systems(Startup, set_up_scene)
    .add_systems(Update, print_desired_velocity.after(LandmassSystemSet::Output))
    .add_systems(Update, quit.after(print_desired_velocity))
    .run();
}

fn set_up_scene(
  mut commands: Commands,
  mut nav_meshes: ResMut<Assets<NavMesh2d>>,
) {
  let archipelago_id = commands.spawn(Archipelago2d::new()).id();

  let nav_mesh_handle = nav_meshes.reserve_handle();

  commands
    .spawn((
      TransformBundle::default(),
      Island2dBundle {
        island: Island,
        archipelago_ref: ArchipelagoRef2d::new(archipelago_id),
        nav_mesh: nav_mesh_handle.clone(),
      },
    ));
  
  // The nav mesh can be populated in another system, or even several frames
  // later.
  let nav_mesh = Arc::new(NavigationMesh2d {
      vertices: vec![
        Vec2::new(1.0, 1.0),
        Vec2::new(2.0, 1.0),
        Vec2::new(2.0, 2.0),
        Vec2::new(1.0, 2.0),
        Vec2::new(2.0, 3.0),
        Vec2::new(1.0, 3.0),
        Vec2::new(2.0, 4.0),
        Vec2::new(1.0, 4.0),
      ],
      polygons: vec![
        vec![0, 1, 2, 3],
        vec![3, 2, 4, 5],
        vec![5, 4, 6, 7],
      ],
      polygon_type_indices: vec![0, 0, 0],
    }.validate().expect("is valid"));
  nav_meshes.insert(&nav_mesh_handle, NavMesh2d{
    nav_mesh,
    type_index_to_node_type: Default::default(),
  });

  commands.spawn((
    TransformBundle {
      local: Transform::from_translation(Vec3::new(1.5, 1.5, 0.0)),
      ..Default::default()
    },
    Agent2dBundle {
      agent: Agent {
        radius: 0.5,
        desired_speed: 1.0,
        max_speed: 2.0,
      },
      archipelago_ref: ArchipelagoRef2d::new(archipelago_id),
      target: AgentTarget2d::Point(Vec2::new(1.5, 3.5)),
      velocity: Default::default(),
      state: Default::default(),
      desired_velocity: Default::default(),
    }
  ));
}

fn print_desired_velocity(query: Query<(Entity, &AgentDesiredVelocity2d)>) {
  for (entity, desired_velocity) in query.iter() {
    println!(
      "entity={:?}, desired_velocity={}",
      entity,
      desired_velocity.velocity());
  }
}

fn quit(mut exit: EventWriter<AppExit>) {
  // Quit so doctests pass.
  exit.send(AppExit::Success);
}

许可协议

在以下任一许可协议下使用

任选其一。

贡献

除非您明确声明,否则您提交的任何有意包含在作品中的贡献,根据Apache-2.0许可协议定义,应按上述方式双许可,不附加任何额外条款或条件。

依赖项

~39–76MB
~1.5M SLoC