bevy_scriptum 📜
bevy_scriptum is a a plugin for Bevy that allows you to write some of your game logic in a scripting language. Currently Rhai and Lua are supported, but more languages may be added in the future.
Everything you need to know to get started with using this library is contained in the bevy_scriptum book
API docs are available in docs.rs
bevy_scriptum's main advantages include:
- low-boilerplate
- easy to use
- asynchronicity with a promise-based API
- flexibility
- hot-reloading
Scripts are separate files that can be hot-reloaded at runtime. This allows you to quickly iterate on your game logic without having to recompile your game.
All you need to do is register callbacks on your Bevy app like this:
use *;
use *;
use *;
new
.add_plugins
.
.run;
And you can call them in your scripts like this:
hello_bevy
Every callback function that you expose to the scripting language is also a Bevy system, so you can easily query and mutate ECS components and resources just like you would in a regular Bevy system:
use *;
use *;
use *;
;
new
.add_plugins
.
.run;
You can also pass arguments to your callback functions, just like you would in a regular Bevy system - using In
structs with tuples:
use *;
use *;
use *;
new
.add_plugins
.
.run;
which you can then call in your script like this:
fun_with_string_param
It is also possible to split the definition of your callback functions up over multiple plugins. This enables you to split up your code by subject and keep the main initialization light and clean.
This can be accomplished by using add_scripting_api
. Be careful though, add_scripting
has to be called before adding plugins.
use *;
use *;
use *;
;
new
.add_plugins
.
.add_plugins
.run;
Usage
Add the following to your Cargo.toml
:
[]
= { = "0.7", = ["lua"] }
or execute cargo add bevy_scriptum --features lua
from your project directory.
You can now start exposing functions to the scripting language. For example, you can expose a function that prints a message to the console:
use *;
use *;
use *;
new
.add_plugins
.
.run;
Then you can create a script file in assets
directory called script.lua
that calls this function:
my_print
And spawn an entity with attached Script
component with a handle to a script source file:
use *;
use *;
use *;
new
.add_plugins
.
.add_systems
.run;
You should then see my_print: 'Hello world!'
printed in your console.
Provided examples
You can also try running provided examples by cloning this repository and running cargo run --example <example_name>_<language_name>
. For example:
The examples live in examples
directory and their corresponding scripts live in assets/examples
directory within the repository.
Bevy compatibility
bevy version | bevy_scriptum version |
---|---|
0.16 | 0.8 |
0.15 | 0.7 |
0.14 | 0.6 |
0.13 | 0.4-0.5 |
0.12 | 0.3 |
0.11 | 0.2 |
0.10 | 0.1 |
Promises - getting return values from scripts
Every function called from script returns a promise that you can call :and_then
with a callback function on. This callback function will be called when the promise is resolved, and will be passed the return value of the function called from script. For example:
get_player_name:
which will print out John
when used with following exposed function:
use *;
use *;
use *;
new
.add_plugins
.;
Access entity from script
A variable called entity
is automatically available to all scripts - it represents bevy entity that the Script
component is attached to.
It exposes index
property that returns bevy entity index.
It is useful for accessing entity's components from scripts.
It can be used in the following way:
print
entity
variable is currently not available within promise callbacks.
Contributing
Contributions are welcome! Feel free to open an issue or submit a pull request.
License
bevy_scriptum is licensed under either of the following, at your option: Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0) or MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)