From c5a3d1c40171d4bccfea5544ea7254e3cc64f223 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Wed, 6 Nov 2024 22:42:25 -0500 Subject: [PATCH 1/3] lunex testing --- Cargo.lock | 185 ++++++++++++++++++++++++++++++ game/main/Cargo.toml | 1 + game/main/src/main.rs | 3 + game/main/src/phos.rs | 2 + game/main/src/ui/game/build_ui.rs | 44 +++++++ game/main/src/ui/game/mod.rs | 1 + game/main/src/ui/mod.rs | 1 + 7 files changed, 237 insertions(+) create mode 100644 game/main/src/ui/game/build_ui.rs create mode 100644 game/main/src/ui/game/mod.rs create mode 100644 game/main/src/ui/mod.rs diff --git a/Cargo.lock b/Cargo.lock index dee1c96..4f9748d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -745,6 +745,30 @@ dependencies = [ "encase_derive_impl", ] +[[package]] +name = "bevy_eventlistener" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63aff74ac1477b88b57ff2f82fc711a7931414be7ee7d0e96aeea45b6d4a7cb6" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_eventlistener_derive", + "bevy_hierarchy", + "bevy_utils", +] + +[[package]] +name = "bevy_eventlistener_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fc779559aa23b81da2b14fba90586755d225983c5b6d3154658e42fc088de7f" +dependencies = [ + "proc-macro2 1.0.86", + "quote 1.0.36", + "syn 2.0.70", +] + [[package]] name = "bevy_gilrs" version = "0.14.2" @@ -913,6 +937,18 @@ dependencies = [ "tracing-wasm", ] +[[package]] +name = "bevy_lunex" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e2bb6bf7507c23bb69edf4f045312448b8dbba73b85dda58e9178255ece099" +dependencies = [ + "bevy", + "bevy_mod_picking", + "colored", + "lunex_engine", +] + [[package]] name = "bevy_macro_utils" version = "0.14.2" @@ -948,6 +984,48 @@ dependencies = [ "glam", ] +[[package]] +name = "bevy_mod_picking" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e290b8ad3e72dc621da7a9c21129da10540d78290ef8857353190e0213cac692" +dependencies = [ + "bevy_app", + "bevy_core", + "bevy_ecs", + "bevy_eventlistener", + "bevy_math", + "bevy_picking_core", + "bevy_picking_highlight", + "bevy_picking_input", + "bevy_picking_raycast", + "bevy_picking_selection", + "bevy_reflect", + "bevy_render", + "bevy_utils", + "bevy_window", +] + +[[package]] +name = "bevy_mod_raycast" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9e4ff45885c4716771a9f55977d8ce69596502a5241da55bf608d7cd71a9cb3" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_derive", + "bevy_ecs", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "crossbeam-channel", +] + [[package]] name = "bevy_pbr" version = "0.14.2" @@ -975,6 +1053,90 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "bevy_picking_core" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020b6cf6079927a1e6a3dd883986546632d8d09ab77840997f4936a74eade722" +dependencies = [ + "bevy_app", + "bevy_derive", + "bevy_ecs", + "bevy_eventlistener", + "bevy_math", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_utils", + "bevy_window", + "uuid", +] + +[[package]] +name = "bevy_picking_highlight" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ba45161608da1bb58cbc55fd83cf5e529e616a180778c394733c85056cd2b76" +dependencies = [ + "bevy_app", + "bevy_asset", + "bevy_color", + "bevy_ecs", + "bevy_picking_core", + "bevy_picking_selection", + "bevy_reflect", +] + +[[package]] +name = "bevy_picking_input" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba8cf67c68a5e150c066366744f9a44006ead9ad280de1c9ca69a6a13c5e283" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_hierarchy", + "bevy_input", + "bevy_math", + "bevy_picking_core", + "bevy_picking_selection", + "bevy_reflect", + "bevy_render", + "bevy_utils", + "bevy_window", +] + +[[package]] +name = "bevy_picking_raycast" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b024e7b0a6062aafd5daa746e5298a1b726c6409de11e35e0b574b712ebda3d" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_mod_raycast", + "bevy_picking_core", + "bevy_reflect", + "bevy_render", + "bevy_transform", + "bevy_window", +] + +[[package]] +name = "bevy_picking_selection" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf0769d84e944fbc09b0475f068e5232a8a4be15339796539aecd747413ededd" +dependencies = [ + "bevy_app", + "bevy_ecs", + "bevy_eventlistener", + "bevy_input", + "bevy_picking_core", + "bevy_reflect", + "bevy_utils", +] + [[package]] name = "bevy_ptr" version = "0.14.2" @@ -1608,6 +1770,16 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "colored" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbf2150cce219b664a8a70df7a1f933836724b503f8a413af9365b4dcc4d90b8" +dependencies = [ + "lazy_static", + "windows-sys 0.48.0", +] + [[package]] name = "com" version = "0.6.0" @@ -3079,6 +3251,18 @@ dependencies = [ "imgref", ] +[[package]] +name = "lunex_engine" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64d55d2e631c0eb2d5bc164ca826452f550a57a9b0d8da93e6e5625d23f533bd" +dependencies = [ + "bevy", + "colored", + "indexmap", + "thiserror", +] + [[package]] name = "mach2" version = "0.4.2" @@ -3966,6 +4150,7 @@ dependencies = [ "bevy", "bevy-inspector-egui", "bevy_asset_loader", + "bevy_lunex", "bevy_rapier3d", "buildings", "image 0.25.2", diff --git a/game/main/Cargo.toml b/game/main/Cargo.toml index c6505ef..9164367 100644 --- a/game/main/Cargo.toml +++ b/game/main/Cargo.toml @@ -27,6 +27,7 @@ bevy_asset_loader = { version = "0.21.0", features = [ ] } ron = "0.8.1" image = "0.25.2" +bevy_lunex = "0.2.4" [features] tracing = [ diff --git a/game/main/src/main.rs b/game/main/src/main.rs index ba158be..d758662 100644 --- a/game/main/src/main.rs +++ b/game/main/src/main.rs @@ -1,3 +1,5 @@ +use std::env; + use bevy::pbr::wireframe::WireframePlugin; use bevy::prelude::*; use bevy::render::texture::{ImageAddressMode, ImageFilterMode, ImageSamplerDescriptor}; @@ -10,6 +12,7 @@ mod map_rendering; mod phos; mod prelude; mod shader_extensions; +mod ui; mod utlis; fn main() { diff --git a/game/main/src/phos.rs b/game/main/src/phos.rs index b9b66ac..538a0c8 100644 --- a/game/main/src/phos.rs +++ b/game/main/src/phos.rs @@ -1,6 +1,7 @@ use crate::camera_system::components::PhosCamera; use crate::map_rendering::map_init::MapInitPlugin; use crate::map_rendering::render_distance_system::RenderDistancePlugin; +use crate::ui::game::build_ui::BuildUiPlugin; use crate::utlis::editor_plugin::EditorPlugin; use crate::utlis::tile_selection_plugin::TileSelectionPlugin; use crate::{camera_system::camera_plugin::PhosCameraPlugin, utlis::debug_plugin::DebugPlugin}; @@ -37,6 +38,7 @@ impl Plugin for PhosGamePlugin { MapInitPlugin, RenderDistancePlugin, BuildingPugin, + BuildUiPlugin, UnitsPlugin, DespawnPuglin, TileSelectionPlugin, diff --git a/game/main/src/ui/game/build_ui.rs b/game/main/src/ui/game/build_ui.rs new file mode 100644 index 0000000..4aeeb0f --- /dev/null +++ b/game/main/src/ui/game/build_ui.rs @@ -0,0 +1,44 @@ +use bevy::prelude::*; +use bevy_lunex::prelude::*; +use shared::tags::MainCamera; + +pub struct BuildUiPlugin; + +impl Plugin for BuildUiPlugin { + fn build(&self, app: &mut App) { + app.add_plugins(UiDefaultPlugins) + .add_plugins(UiDebugPlugin::::new()); + + app.add_systems(PostStartup, setup_ui); + } +} + +fn setup_ui(mut commands: Commands, cam: Query>, assets: Res) { + let c = cam.single(); + commands.entity(c).insert(MainUi); + + commands + .spawn(( + UiTreeBundle:: { + tree: UiTree::new2d("BuildUi"), + ..default() + }, + Name::new("Build UI"), + SourceFromCamera, + )) + .with_children(|ui| { + ui.spawn(( + UiLink::::path("Root"), + UiLayout::boundary() + .pos1(Ab(20.0)) + .pos2(Rl(100.0) - Ab(20.0)) + .pack::(), + )); + + ui.spawn(( + UiLink::::path("Root/Rect"), + UiLayout::solid().size((Ab(1920.0), Ab(1080.0))).pack::(), + UiImage2dBundle::from(assets.load("textures/world/test2.png")), + )); + }); +} diff --git a/game/main/src/ui/game/mod.rs b/game/main/src/ui/game/mod.rs new file mode 100644 index 0000000..791f966 --- /dev/null +++ b/game/main/src/ui/game/mod.rs @@ -0,0 +1 @@ +pub mod build_ui; \ No newline at end of file diff --git a/game/main/src/ui/mod.rs b/game/main/src/ui/mod.rs new file mode 100644 index 0000000..f7ee1cd --- /dev/null +++ b/game/main/src/ui/mod.rs @@ -0,0 +1 @@ +pub mod game; From fe9862718604bae55a4de4f039d847415d30dd3c Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Mon, 11 Nov 2024 20:46:21 -0500 Subject: [PATCH 2/3] misc --- game/main/src/camera_system/camera_plugin.rs | 2 ++ game/main/src/main.rs | 1 - game/main/src/map_rendering/render_distance_system.rs | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/game/main/src/camera_system/camera_plugin.rs b/game/main/src/camera_system/camera_plugin.rs index e3bb960..65348f7 100644 --- a/game/main/src/camera_system/camera_plugin.rs +++ b/game/main/src/camera_system/camera_plugin.rs @@ -3,6 +3,7 @@ use bevy::core_pipeline::prepass::DepthPrepass; use bevy::input::mouse::{MouseMotion, MouseScrollUnit, MouseWheel}; use bevy::prelude::*; use bevy::window::{CursorGrabMode, PrimaryWindow}; +use bevy_lunex::prelude::MainUi; use shared::sets::GameplaySet; use shared::tags::MainCamera; use world_generation::hex_utils::HexCoord; @@ -59,6 +60,7 @@ fn setup(mut commands: Commands, mut msaa: ResMut) { MainCamera, DepthPrepass, PhosOrbitCamera::default(), + MainUi, )) .insert(TemporalAntiAliasBundle::default()); diff --git a/game/main/src/main.rs b/game/main/src/main.rs index 7181fca..d758662 100644 --- a/game/main/src/main.rs +++ b/game/main/src/main.rs @@ -14,7 +14,6 @@ mod prelude; mod shader_extensions; mod ui; mod utlis; -mod ui; fn main() { App::new() diff --git a/game/main/src/map_rendering/render_distance_system.rs b/game/main/src/map_rendering/render_distance_system.rs index e7aaa80..ea70ed9 100644 --- a/game/main/src/map_rendering/render_distance_system.rs +++ b/game/main/src/map_rendering/render_distance_system.rs @@ -1,4 +1,5 @@ use bevy::prelude::*; +use shared::tags::MainCamera; use crate::camera_system::components::PhosCamera; @@ -52,7 +53,7 @@ impl Default for RenderDistanceVisibility { fn render_distance_system( mut objects: Query<(&Transform, &mut Visibility, &RenderDistanceVisibility)>, - camera_query: Query<&Transform, With>, + camera_query: Query<&Transform, With>, settings: Res, ) { let camera = camera_query.single(); From ea271c25d065b04c3bbc7af44933c4621f84fec3 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Thu, 14 Nov 2024 22:52:54 -0500 Subject: [PATCH 3/3] preparation of building asset structure --- game/buildings/src/assets/building_asset.rs | 25 ++++++++++++++++++- .../buildings/src/buildings/basic_building.rs | 4 +++ .../src/buildings/factory_building.rs | 6 +++++ game/buildings/src/buildings/mod.rs | 4 +++ .../src/buildings/resource_gathering.rs | 8 ++++++ game/buildings/src/buildings/tech_building.rs | 9 +++++++ game/buildings/src/lib.rs | 1 + game/main/src/camera_system/camera_plugin.rs | 4 ++- game/main/src/ui/game/build_ui.rs | 22 +++++++++++----- game/shared/src/building.rs | 3 ++- game/shared/src/identifiers.rs | 10 ++++++-- game/shared/src/lib.rs | 15 +++++++++++ game/units/src/lib.rs | 2 ++ 13 files changed, 102 insertions(+), 11 deletions(-) create mode 100644 game/buildings/src/buildings/basic_building.rs create mode 100644 game/buildings/src/buildings/factory_building.rs create mode 100644 game/buildings/src/buildings/mod.rs create mode 100644 game/buildings/src/buildings/resource_gathering.rs create mode 100644 game/buildings/src/buildings/tech_building.rs diff --git a/game/buildings/src/assets/building_asset.rs b/game/buildings/src/assets/building_asset.rs index 5aea700..acc372d 100644 --- a/game/buildings/src/assets/building_asset.rs +++ b/game/buildings/src/assets/building_asset.rs @@ -3,7 +3,13 @@ use bevy::prelude::*; use serde::{Deserialize, Serialize}; use shared::identifiers::ResourceIdentifier; -use crate::footprint::BuildingFootprint; +use crate::{ + buildings::{ + basic_building::BasicBuildingInfo, factory_building::FactoryBuildingInfo, + resource_gathering::ResourceGatheringBuildingInfo, + }, + footprint::BuildingFootprint, +}; #[derive(Asset, TypePath, Debug, Serialize, Deserialize)] pub struct BuildingAsset { @@ -17,8 +23,25 @@ pub struct BuildingAsset { pub cost: Vec, pub consumption: Vec, pub production: Vec, + + pub health: u32, + + pub building_type: BuildingType, + pub animations: Vec, } +#[derive(Serialize, Deserialize, Debug, TypePath)] +pub enum BuildingType { + Basic, + Gathering(ResourceGatheringBuildingInfo), + FactoryBuildingInfo(FactoryBuildingInfo), +} + +#[derive(Serialize, Deserialize, Debug, Reflect)] +pub enum AnimationComponent { + Rotation, + Slider, +} create_asset_loader!( BuildingAssetPlugin, BuildingAssetLoader, diff --git a/game/buildings/src/buildings/basic_building.rs b/game/buildings/src/buildings/basic_building.rs new file mode 100644 index 0000000..6cc5598 --- /dev/null +++ b/game/buildings/src/buildings/basic_building.rs @@ -0,0 +1,4 @@ +use serde::{Deserialize, Serialize}; +use shared::identifiers::ResourceIdentifier; +#[derive(Serialize, Deserialize, Debug)] +pub struct BasicBuildingInfo {} diff --git a/game/buildings/src/buildings/factory_building.rs b/game/buildings/src/buildings/factory_building.rs new file mode 100644 index 0000000..9c78898 --- /dev/null +++ b/game/buildings/src/buildings/factory_building.rs @@ -0,0 +1,6 @@ +use serde::{Deserialize, Serialize}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct FactoryBuildingInfo { + pub units_to_build: Vec<()> +} diff --git a/game/buildings/src/buildings/mod.rs b/game/buildings/src/buildings/mod.rs new file mode 100644 index 0000000..3293ddb --- /dev/null +++ b/game/buildings/src/buildings/mod.rs @@ -0,0 +1,4 @@ +pub mod resource_gathering; +pub mod basic_building; +pub mod factory_building; +pub mod tech_building; diff --git a/game/buildings/src/buildings/resource_gathering.rs b/game/buildings/src/buildings/resource_gathering.rs new file mode 100644 index 0000000..85dd925 --- /dev/null +++ b/game/buildings/src/buildings/resource_gathering.rs @@ -0,0 +1,8 @@ +use serde::{Deserialize, Serialize}; +use shared::identifiers::ResourceIdentifier; + +#[derive(Serialize, Deserialize, Debug)] +pub struct ResourceGatheringBuildingInfo { + pub resources_to_gather: Vec, + pub gather_range: usize, +} diff --git a/game/buildings/src/buildings/tech_building.rs b/game/buildings/src/buildings/tech_building.rs new file mode 100644 index 0000000..3e9f89f --- /dev/null +++ b/game/buildings/src/buildings/tech_building.rs @@ -0,0 +1,9 @@ +use serde::{Deserialize, Serialize}; +use shared::{building::BuildingIdentifier, StatusEffect}; + +#[derive(Serialize, Deserialize, Debug)] +pub struct TechBuildingInfo { + pub effect_range: usize, + pub buildings_to_unlock: Vec, + pub buffs: Vec, +} diff --git a/game/buildings/src/lib.rs b/game/buildings/src/lib.rs index 9e24bf4..75fd0e0 100644 --- a/game/buildings/src/lib.rs +++ b/game/buildings/src/lib.rs @@ -4,4 +4,5 @@ pub mod building_plugin; pub mod buildings_map; pub mod footprint; pub mod prelude; +mod buildings; pub use building_plugin::*; diff --git a/game/main/src/camera_system/camera_plugin.rs b/game/main/src/camera_system/camera_plugin.rs index 65348f7..2eecf03 100644 --- a/game/main/src/camera_system/camera_plugin.rs +++ b/game/main/src/camera_system/camera_plugin.rs @@ -2,6 +2,7 @@ use bevy::core_pipeline::experimental::taa::{TemporalAntiAliasBundle, TemporalAn use bevy::core_pipeline::prepass::DepthPrepass; use bevy::input::mouse::{MouseMotion, MouseScrollUnit, MouseWheel}; use bevy::prelude::*; +use bevy::render::view::RenderLayers; use bevy::window::{CursorGrabMode, PrimaryWindow}; use bevy_lunex::prelude::MainUi; use shared::sets::GameplaySet; @@ -62,7 +63,8 @@ fn setup(mut commands: Commands, mut msaa: ResMut) { PhosOrbitCamera::default(), MainUi, )) - .insert(TemporalAntiAliasBundle::default()); + .insert(TemporalAntiAliasBundle::default()) + .insert(RenderLayers::layer(0)); *msaa = Msaa::Off; } diff --git a/game/main/src/ui/game/build_ui.rs b/game/main/src/ui/game/build_ui.rs index 4aeeb0f..78ec27f 100644 --- a/game/main/src/ui/game/build_ui.rs +++ b/game/main/src/ui/game/build_ui.rs @@ -1,4 +1,4 @@ -use bevy::prelude::*; +use bevy::{prelude::*, render::view::RenderLayers}; use bevy_lunex::prelude::*; use shared::tags::MainCamera; @@ -6,16 +6,23 @@ pub struct BuildUiPlugin; impl Plugin for BuildUiPlugin { fn build(&self, app: &mut App) { - app.add_plugins(UiDefaultPlugins) - .add_plugins(UiDebugPlugin::::new()); + // app.add_plugins(UiDefaultPlugins) + // .add_plugins(UiDebugPlugin::::new()); app.add_systems(PostStartup, setup_ui); } } -fn setup_ui(mut commands: Commands, cam: Query>, assets: Res) { - let c = cam.single(); - commands.entity(c).insert(MainUi); +fn setup_ui(mut commands: Commands, assets: Res) { + commands + .spawn(( + Camera2dBundle { + transform: Transform::from_xyz(0.0, 0.0, 1000.0), + ..default() + }, + MainUi, + )) + .insert(RenderLayers::layer(1)); commands .spawn(( @@ -25,6 +32,7 @@ fn setup_ui(mut commands: Commands, cam: Query>, assets }, Name::new("Build UI"), SourceFromCamera, + RenderLayers::layer(1), )) .with_children(|ui| { ui.spawn(( @@ -33,12 +41,14 @@ fn setup_ui(mut commands: Commands, cam: Query>, assets .pos1(Ab(20.0)) .pos2(Rl(100.0) - Ab(20.0)) .pack::(), + RenderLayers::layer(1), )); ui.spawn(( UiLink::::path("Root/Rect"), UiLayout::solid().size((Ab(1920.0), Ab(1080.0))).pack::(), UiImage2dBundle::from(assets.load("textures/world/test2.png")), + RenderLayers::layer(1), )); }); } diff --git a/game/shared/src/building.rs b/game/shared/src/building.rs index e3bdafc..3131418 100644 --- a/game/shared/src/building.rs +++ b/game/shared/src/building.rs @@ -1,6 +1,7 @@ +use bevy::reflect::Reflect; use serde::{Deserialize, Serialize}; -#[derive(Default, PartialEq, Eq, Serialize, Deserialize)] +#[derive(Default, Reflect, Debug, PartialEq, Eq, Serialize, Deserialize)] pub struct BuildingIdentifier(pub usize); impl From for BuildingIdentifier { diff --git a/game/shared/src/identifiers.rs b/game/shared/src/identifiers.rs index f1947d9..166f5d7 100644 --- a/game/shared/src/identifiers.rs +++ b/game/shared/src/identifiers.rs @@ -1,9 +1,15 @@ -use bevy::prelude::Resource; +use bevy::reflect::Reflect; use serde::{Deserialize, Serialize}; use world_generation::hex_utils::HexCoord; -#[derive(Serialize, Deserialize, Debug)] +#[derive(Serialize, Deserialize, Debug, Reflect)] pub struct ResourceIdentifier { pub id: u32, pub qty: u32, } + +#[derive(Serialize, Deserialize, Debug, Reflect)] +pub struct UnitIdentifier(u32); + +#[derive(Serialize, Deserialize, Debug, Reflect)] +pub struct TileIdentifier(u32); diff --git a/game/shared/src/lib.rs b/game/shared/src/lib.rs index b2f1167..2de0e49 100644 --- a/game/shared/src/lib.rs +++ b/game/shared/src/lib.rs @@ -1,3 +1,4 @@ +use bevy::reflect::Reflect; use serde::{Deserialize, Serialize}; pub mod building; @@ -17,3 +18,17 @@ pub enum Tier { Three, Superior, } + +#[derive(Serialize, Deserialize, Debug, Reflect)] +pub enum StatusEffect { + UnitRange(f32), + UnitAttack(f32), + UnitHealth(f32), + StructureRange(f32), + StructureAttack(f32), + StructureHealth(f32), + BuildSpeedMulti(f32), + BuildCostMulti(f32), + ConsumptionMulti(f32), + ProductionMulti(f32), +} diff --git a/game/units/src/lib.rs b/game/units/src/lib.rs index 440c589..61e9eb8 100644 --- a/game/units/src/lib.rs +++ b/game/units/src/lib.rs @@ -1,3 +1,5 @@ +use bevy::reflect::Reflect; +use serde::{Deserialize, Serialize}; pub mod assets; pub mod components;