Oh I guess I can provide two cents here. Unity veteran of ~10 years but it's frustrated the $#!% out of me for at least the latter half of those, and I really like Godot. Some thoughts in no particular order:
Workflow in Godot is so much nicer. If you need <Thing> often you can just right-click in the inspector and "Create New <Thing>" and it'll plop one into memory for you. Say I want to add like a gradient sky or something. I add a mesh filter node, go to the inspector, right-click and add a new QuadMesh (or Sphere or Torus or whatever, you've got options and they're configurable unlike Unity's), Right-click and add a new GradientTexture (lots of options for creating new textures too, such as gradients, noise, and obviously images). The GradientTexture is fully configurable where I can change the colors, the interpolation, the # of interpolating points, the shape of the gradient, etc. etc.
It'll start rendering without even needing to add a material. I also could have done the same thing using a Sprite instead of a MeshFilter and skipped needing a mesh. They both render (almost) the same way if I attach a CanvasMaterial to them. And if I wanna throw a custom shader on it? I can just right-click a material and turn it into a ShaderMaterial. Then in that ShaderMaterial I can go in and right-click to create a new Shader. And I can choose a visual node-based shader or a regular one. And if down the line I want to turn that visual shader into a regular one, it lets me do that.
Now all of these things I've created right there in the inspector, and they all are actually living in memory as "Sub-Resources" of my mesh filter node. They get serialized with the scene when I save it. But what if I'd rather keep them saved to the project instead? I can just do that. Anything that is a Resource can live in a scene or on its own in the file system. Nodes that reference them will update their reference when you move them. And nodes will all naturally share instances of resources. If you make a copy of a node, that copy will point to the same mesh/texture/material/whatever on disk and in memory. Unless you don't want it to, in which case you just right-click and hit "make unique".
It offers SO MUCH flexibility and streamlining which is super helpful for when you're experimenting around or prototyping or refactoring or extending or whathaveyou.
By contrast, it felt like I was always fighting with Unity to get resources to be where and how I wanted them to be. If some data lives inside of a prefab, sometimes Unity will hide it from me, or I'll be unable to modify it, or I forgot that I messed around with a shader variable which automatically created a new instance of my material. If I want something serialized in the scene to be serialized in assets or outside of project, I probably need to write an editor script to properly extract whatever the data is. Unity often has very different interfaces for interacting with a component in the editor or through code. In Godot? Same interface. In fact usually the engine internals even often use the same interface.
Well, I was going to make a list of things but then I got carried away with point #1 and I have things I need to do. Ok quick points:
- Godot's graphical rendering is more flexible but more limited, slower, and sometimes buggier than Unity's (no 3 pipelines though 🙃 )
- Unity games are much more performant, especially if you're using the PITA that is DOTS
- The Godot editor is much much faster than the Unity editor.
- Godot has a dedicated 2D system with physics server, render pipeline, views and tools etc. Unity fakes 2D in 3D.
- Godot hasn't been around as long as Unity, so hasn't had as much dev time or community buildup yet.
- Unity's physics are much better, but Jolt should hopefully fix that.
- I don't like Godot's C#. I know it's gotten better and they're still constantly improving it, but it still doesn't feel like a first class citizen (and I normally love working with C#)
- The standard (gdscript only) editor is smaller and faster with smaller binaries than the C# one anyways
- You can use C++ for performant code in Godot if you need to. It has actually more flexibility than C# or gdscript.
- Unity can only really utilize C++ libraries on an API level.
- Godot can actually be hooked up with whatever language you want (seems to be a number of Rust fans)
- Unity, again, only really can utilize libraries.
- UI in Godot games is the same code as the Godot editor uses. Plugins can use the same classes as GUIs, and there are Godot editors running in browser and on Android for this reason.
- Meanwhile Unity still has... is it three or four?... different ways of doing UI and still create the editor UI entirely differently.
- Both Unity and Godot have garbage networking, but Godot doesn't have Photon as an uption 🙁
- The lead core developers are really nice. The Unity executive board smells bad (unconfirmed)
- Oh yeah and Godot is open source, so you can go look for yourself what the engine is doing or report a bug to get fixed or fix an issue or add a feature yourself.