Ok. I have a lot to go on on this so I’ll split it in a few categories. Please take in mind that I haven’t explored Unity very in-depth and for some of the things that annoyed me at Unity there might actually be less frustrating solutions I haven’t known about.
The tooling
I think Defold offers simpler and more barebones solutions than Unity, which are often easier to use. This simplicity, though, is sometimes a blessing and sometimes a curse. It allows you to be more flexible, but at times requires you to put in a bit more work instead of using pre-made stuff.
I felt the Unity workflow is not really optimised for 2D. For example, making a simple fade out animation involved creating a bunch of animation files and fiddling with keyframes, instead of a simple go.animate()
.
Resource management in Defold also felt much simpler than in Unity. I find the fact that the engine creates atlases for you instead of you having to remake them every time you change / remove one of the images infinitely more convenient.
Unity has a lot of pre-made UI widgets, but some of them don’t exactly do what you need them to or if they do, they require a lot of configuration. Using Unity’s scroll view, for instance, was a bit like shooting myself in the foot. It felt poorly implemented and hard to make it feel right on all platforms. In Defold, I just proceeded writing my own, which took a bit more, but yielded a better result.
On the other hand, I miss Unity’s auto-scaling GUI layout system. I think Defold’s layout system tries to be simple, but makes it hard to control how things stretch and anchor, especially in nested layouts. I had to write a small layout library that listens to @render:window_resized
and then does the right thing.
Sound is also a big pitfall of Defold. Not being able to do basic things like pausing and skipping through music is a bit constraining. But, I understand there’s work scheduled on sound.
The programming experience
This could be personal preference, coming from a heavy JS background, but for game logic and rapid development in general, I think languages like C# and Java are a poor choice. While working in C# I felt like I was unnecessarily constrained by classes and C#'s rigid syntax and static types. While it’s true that it’s much harder to write buggy code when the language watches your back like that, I ended up spending a lot of time writing boilerplate code I wouldn’t have written in a dynamic language like Lua. Besides time spent, I think that takes away from the joy of coding and from your motivation sometimes.
Adding to that, I think that Lua has some really smart and simple solutions to many design problems (from the flexibility of tables to emulating Python’s tuples with multiple return values to its awesome stack-based C API). I was in love with Lua long before Defold and, to be honest, it’s pretty much a joy to work in it. I sometimes miss the functionals that JS has (map(), reduce(), filter() etc.), but then I’m reminded that in game code you don’t really work that much with data structures more complicated than an object anyway.
Performance
While I could make a game pretty quickly in Unity, performance on mobile really took a hit. There’s a clear performance difference for 2D. I haven’t sat through and profiled it properly, so I’m not sure where the bottleneck was in the Unity build, but the Defold one is blazing fast.
What’s also to note is editor performance. The Unity editor sometimes felt sluggish, which isn’t something that I feel with the Defold editor.