The purpose of this document is to help us evaluate designs for the Bevy Editor by identifying:
This isn't intended to be super prescriptive: it's just a basic tool for prioritization and talking about our users.
In general, we have two broad categories of users:
These people may work as individuals or in teams. The main difference between teams is size:
Teams and users are Commercial (as opposed to Non-Commercial) if they have funding for their work, or plan to use Bevy to make money.
One of the other key difference between teams is their willingness to hack bevy's internals:
Users can be further differentiated according to many other less general aspects:
Bevy has a large user-base of of Non-Commercial Technical Individuals (hobbyist programmers). Most of these people are Mainline, using the most recent release of bevy as a dependency. They do not build the engine from source, modify the engine internals, or submit patches to the repo.
We have a smaller set of Forking/Patching Technical Individuals (engine contributors). These are mostly Non-Commercial as well, and work on bevy in their spare time. One of Bevy's greatest strengths is that "Bevy App developers are Bevy Engine developers, they just don't know it yet," which means this set of users is porous and constantly expanding.
There are a small number of Commercial Technical Individuals like Dustin Deweese (Noumental) and Pressing Thumbs Games (Times of Progress). Dustin is Forking, and upstreams mainline changes to his private branches. Pressing Thumbs is keeps Mainline.
We have basically no Non-Technical Individuals currently. But that's to be expected; it's a code-forward engine.
Moving on to teams, we've got more diversity. Non-commercial teams seem to be uniformly Mainline. They don't have the resources to fiddle with the engine or editor. Most Commercial teams seem to be Patching or Mainline, including Foresight and Dead Money (Architect of Ruin). This is likely due to our non-existent legacy support and our policy of not back-porting critical patches to older versions; a hard fork is not an easy thing to maintain. One notable exception is Pounce Light (Tiny Glade) who went Forking very early on (to great success).
For the MVP, we are going to focus on supporting:
I'm going to call people from these sorts of teams Category A.
Why focus on these people? First of all, it is commercial teams that ship most games and provide the bulk of the Bevy Foundation's funding. It's also commercial teams where you will currently find most Non-Technical Users. And Forking/Patching teams specifically are able to provide support and customization for their Non-Technical members, a burden that would otherwise would fall to us. These teams are also the most likely to contribute patches to the editor once they start using it.
So what shouldn't we prioritize? Bevy is explicitly not targeted at Non-Technical Individuals; someone on your team needs to know rust to use bevy.
The remaining group, Mainline Technical Users and their Non-Technical Teammates, are a second-class priority. Features that support these users are good; but it's not what we should focus on. I'm going to call these people Category B.
Here are some general conclusions about category A.
Now let's imagine a few little teams of this sort, and follow along as they go about their work. This is a slight adaption of the typical "User Stories" which is better suited to making broad technical decisions.
We'll start with simple two-person game studio: Lynn (programmer/level-designer) and Kate (artist/writer/level-designer). Lynn is great with rust, Kate has some programming experience but not in rust. Both know how to use version control. Neither has used Bevy before.
Our two-person studio is designing a 2d puzzle-platformer, the exact mechanics of which are not important.
The first thing Lynn has to do is install bevy and the editor on both of their machines, set up a project, and check it into version control.
This screams template to me. It's probably fine to ship this as a command line tool, since it's Lynn's job to do this part. Not something we need for a prototype, but important for the MVP.
Meanwhile, Kate makes a sprite-sheet for different tiles. They check it in to version control, and wait for Lynn to show them how to start making maps.
Lynn decides to add bevy_ecs_tilemap
to the project and does some very minimal setup. Then she opens the editor, because she wants to make a test-map to learn about how queries work.
Ideally, she should be greeted by an editor that knows about the important components defined by
bevy_ecs_tilemap
.
What Lynn needs to do next is spawn an entity with a TileMapBundle
(or the bsn
equivalent).
How does she do this? More importantly, how does she know she needs to do this?
Let's assume the TileMapBundle
she spawns is empty. She selects the tile map entity so she can edit it.
Perhaps she clicks on it in some sort of hierarchy explorer? It won't be visible yet.
She is presented with a widget that shows the different properties of the components on that entity. She configures things like the size, shape, and transform, and connects up Kate's sprite-sheet as a texture.
How does Lynn get feedback that what she is doing is correct? Pcwalton suggests loading a serialized form of
Schematic
data from the main app.
Now Lynn wants to add some tiles to the tile-sheet. This is complicated; bevy_ecs_tilemap
contains an index, which records the position of different entities. She discovers that she has to spawn each tile entity manually, then go and update the index with it's position before it shows up.
Obviously this isn't ideal, but for the purposes of this user-story let's assume
bevy_ecs_tilemap
has no extra editor support; it's just a WYSIWYG editor for entities and components.
Lynn gets frustrated. But she has heard that Bevy's editor is supposed to be painlessly extensible, so she clones the editor repo, asks for help on discord, and it's not long before she has extended the editor with a widget that lets you spawn and position a tile in a single step.
I'm going to end it here, with the question: How does Lynn get her widget onto Kate's computer? Does she compile a binary and send it to her, or does she check the editor into a new repo (maybe even the game repo?) and let Kate build it?
The existing team is supposed to represent a pair of expert game devs who are new to Bevy, and want to evaluate it for their next project.
In future, I'd like to do another pass on their personas. I'd also like to think about the following cohorts
Obviously, not all of these groups should be prioritized; but it is good to consider as broad and diverse a user-base as possible. People always always find unexpected ways to use software.
I would also like to add some consideration of commercial/funded vs non-commercial groups to the overview section. In some sense, I think it really is commercial groups the editor aught to target initially, if only because we need more sources of funding the non-profit.
Please feel free to modify this document however you see fit.