I wrote an article back on my own blog a while ago about how I was using Scriptable Objects for my JRPG game, and actually added a way to load in from a spreadsheet to populate the scriptable object.
After a lot of work on a variety of different genres, learning about what the quickest way to get shit done is and basically get the hell out of the way of designers, if you are making a data heavy game in Unity, avoid editor windows trying to build stuff around scriptable objects, and trying to have your whole game managed in the editor.
I have written about the great CMS system that Mediatonic have, and if I could use it all the time, I would. Even for non Live Ops games.
That is proprietary tech though. With my Beehive stuff, we have to sort of Guerilla it a bit. And when I say Guerrilla it, that is a bit mean as this is a completely legit way to do this if you don’t have time to write your own proprietary CMS system. And in the case of “getting shit done”, I would also not recommend it if it is gonna slow down actually releasing your product.
For our JRPG project, this is how Beehive deals with data:
- Using a custom Spreadsheet in Google sheets
- Writing the data classes in C#
- A custom tool that converts CSV that we store in Streaming Assets so we can do hot reloading
- A build that allows designers to easily hot reload meaning designers never have to go into Unity
Some of you are probably calling this a little old school, and some of you will be saying that I am missing a lot of great in Editor things I can do with scripting.
The first thing I will talk about is Google Sheets. Sheets or in fact any spreadsheet program is super powerful to deal with one thing. Data. When you can do a lot easy conditional formatting, easily visualise curves to show progression.
Spending time writing custom editor windows, custom inspectors, property drawers, etc in Unity may be technically satisfying, but it takes time from actually making the game.
Yes you have to write a CSV importer for your classes, but in my opinion, even if you have been doing Unity Editor scripting for ages, you will still be spending a fair amount of time going through docs trying to find that specific thing you want an editor window or property drawer or whatever to do the specific thing you want it to do and find out you cannot do it and have to make some sticky plaster solution.
The second element I want to talk about is hot reloading and a build that enables designers to hot reload from it.
Having a custom build for designers, QA and other members of the team that allow you to hot reload data is in my opinion is invaluable.
The other members of your team should not have to clone a repo, download your specific version of Unity, wait for everything to compile and then open your custom editor or locate a scriptable object, and then have to read documentation for or have you explain how to use it. And then, even with a 2 person peer review, an experimental feature goes in and breaks the branch they were working off.
With a discrete build, you don’t have any of the above. The downside is you will potentially have to support specific functionality, but actually, that is going to take you less time then making sure everyone has the correct version of Unity, making sure there is enough licenses and making sure your development branch doesn’t break for designers (spoilers, it eventually will). It basically frees up more time for you and everyone else to just get shit done.
They should just be able to change a page or pages in a Google Sheet, then press a button in the game and it downloads it, with their changes ready to go.
I want to kind off end this article with my main takeaway from the journey that I have taken over the last 7+ years in game dev working closely with all disciplines and that got me to this point.
Although doing stuff in editor, in your engine and using all the cool techy features is well… cool, but at the end of the day, it is not about just you and what you think is best.
It is about the team workflow and getting shit done.
You made a complex cool editor window where I can change some ability data. I mean, that is cool, but if it is not friction-less to use for the rest of the team then it is kind of pointless don’t you think?
Go with the solution that is best for everyone’s workflow not just because you are showing off that you are clever, the engine locks you into it or that you thought it was cool.