demo-11.mp4 |
demo-22.mp4 |
demo-33.mp4 |
demo-44.mp4 |
This template is based on the awesome BevyFlock 2D template featuring out of the box builds for:
- Windows
- Linux
- macOS
- Web (Wasm) This template is a great way to get started if you aim to build new 3D RPG Bevy game! It is not as simple as bevy_new_2d which is aimed to an easy start and no dependencies. It focuses instead to a rather solid starting template with some basic bells and whistles to be able to carry the weight of big projects and tries to follow the flat architercture principle. Start with a basic project and CI / CD that can deploy to itch.io. You can try this template in your browser!
Install cargo-generate or bevy_cli and run:
cargo generate olekspickle/bevy_new_3d_rpg -n my-rpg
# or with bevy_cli
bevy new -t=olekspickle/bevy_new_3d_rpg my-rpg
If you want to use serving with hotpatching, you can use dioxus-cli:
- Linux:
make hot
orbash BEVY_ASSET_ROOT="." dx serve --hot-patch
- Windows PS:
$env:BEVY_ASSET_ROOT="." ; dx serve --hot-patch
- flat cargo project structure for game logic crates that can grow and be maintainable
- import and usage of game mechanics and parameters from .ron (config, credits) (kudos to Caudiciform)
- simple asset loading based on bevy_asset_loader with loading from path addition (kudos to Caudiciform)
- third person camera with bevy_third_person_camera
- top down camera with bevy_top_down_camera
- solid keyboard & gamepad mapping to ui & game actions using bevy_enhanced_input
- simple scene with colliders and rigid bodies using avian3d
- simple player movement using bevy_tnua
- simple skybox sun cycle using bevy atmosphere example, with daynight and nimbus modes
- featuring rig and animations using Universal Animation Library from quaternius
- experimental sound with bevy_seedling based on Firewheel audio engine (which will probably replace bevy_audio), with highly experimental audio stutter fix for web
- consistent Esc back navigation in gameplay and menu via stacked modals (kudos for the idea to skyemakesgames)
- serialize and save settings
- audio, video and keys rebind tabs in settings (currently not really working)
- easy drop in scene integration using awesome skein with a simple scene
- add basic mood change per zone
- implement different music states(exploration, combat)
- custom font replace example using pre-loaded font
- Movement sfx sounds: jump, dash, sprint
- sky background instead of just void lol
- spatial audio demo: boombox emitting background music
- Jump with timer(tricky with tnua jump in air counter)
- small door/portal demo
- split screen for coop
- vault on objects if they are reachable
- climbing
- do not rotate player on aim(silly bug, if you release aim looking to the floor - player model left rotated parallel to the floor)
- basic fighting: punch, kick, take weapon
- weapon select wheel
- bow
- rifle
The best way to get started is to play around with the code you find in src/game/
.
This template comes with a basic project structure that you may find useful:
Path | Description |
---|---|
assets |
Asset directory |
src/main.rs |
App entrypoint where system plugins and window set up |
src/asset_loading |
A high-level way to load collections of asset handles as resources |
src/models |
Data source for the game: inputs, markers, timers |
src/audio |
Marker components for sound effects and music, bus setup |
src/scene |
Scene setup, skybox |
src/player |
Player control & animation |
src/game |
Game mechanics & content |
src/ui |
Reusable UI widgets & game color pallet control |
src/screens |
Splash/title/gameplay and other screen related systems and ui |
Feel free to move things around however you want, though
There are some helpful commands in Makefile to simplify build options But generally running your game locally is very simple:
with bevy_cli
- Dev:
bevy run
to run a native dev build - Release:
bevy run --release
to run a native release build - Use
bevy run --release web
to run a web release build To run a web dev build to run audio in separate thread to avoid audio stuttering: - :
bash bevy run web --headers="Cross-Origin-Opener-Policy:same-origin" --headers="Cross-Origin-Embedder-Policy:credentialless"
with cmake
- Dev:
make run
to run a native dev build - Release:
make build
to build a native release build - Web:
make run-web
to run a web dev build to run audio in separate thread to avoid audio stuttering
Installing Linux dependencies
If you're using Linux, make sure you've installed Bevy's Linux dependencies.
Note that this template enables Wayland support, which requires additional dependencies as detailed in the link above.
Wayland is activated by using the bevy/wayland
feature in the Cargo.toml
.
(Optional) Improving compile times
.cargo/config.toml
contains documentation on how to set up your environment to improve compile times.
WARNING: if you work in a private repository, please be aware that macOS and Windows runners cost more build minutes. For public repositories the workflow runners are free!
This template uses GitHub workflows to run tests and build releases. Check the release-flow
There are some known issues in Bevy that can require arcane workarounds.
This template uses firewheel experimental audio runnign in the separate worker thread, so it should not be happening, but if you experience it nevertheless, here are a few tips:
- If you're using materials, you should force your render pipelines to load at the start of the game
- Optimize your game as much as you can to keep its FPS high.
- Apply the suggestions from the blog post [Workaround for the Choppy Music in Bevy Web Builds].
- Advise your users to try a Chromium-based browser if there are still issues.
The game window is created before the GPU is ready to render everything. This means that it'll start with a white screen for a few frames. The workaround is to spawn the Window hidden and only make it visible a few frames later
Choppy character movement is often caused by movement updates being tied to the frame rate.
See the physics_in_fixed_timestep
example for how to fix this.
Choppy camera movement is almost always caused by the camera being tied too tightly to a moving target position.
You can use smooth_nudge
to make your camera smoothly approach its target position instead.
The assets in this repository are all 3rd-party. See the see credits for more information.
The source code in this repository is licensed under any of the following at your option:
bevy | bevy_new_3d_rpg |
---|---|
0.16 | main,0.1.4 |