Tales of Pirates [Unity]

Recently, I've been feeling like I'm fighting the Unity engine too much. The project doesn't use most of the Unity Editor features, such as prefabs, scenes, ScriptableObjects, etc., that are usually used to compose the game and inject dependencies. Looking for solutions that don't feel awkward, actually work, and scale well takes time, and I felt like I'd been running in circles for the last few weeks rather than making progress.

So I reached out to Godot to experiment with it, and the results were really surprising.

Firstly, I was able to completely migrate the project from Unity in just a couple of hours. ~80% of the code hasn't changed at all and was reused as-is. ~10-15% required mechanical rewrites, mostly replacing Unity types with their Godot equivalents (MonoBehaviour -> Node, Update() -> _Process(), Vector2Int -> Vector2I etc.). The remaining 5-10% was new Godot-specific code, mostly around startup and shaders.

Secondly, the graphics quality is at the same level. I achieved almost full visual parity with Unity without significant effort. Unity still offers better 3D support and more features, but most of them are excessive for this kind of game and won't be needed. The biggest difference right now is how shadows are rendered, but they can be tweaked to match Unity almost identically. I just haven't spent much time configuring them yet.

Here are side-by-side comparison screenshots, with Unity on the left and Godot on the right:


Thirdly, Godot surprisingly seems to fit the project's goals and vision better than Unity. I made this pros and cons list to give you a better idea of which Godot features benefit the project.

Pros:
- Shaders can be built at runtime, which gives mods the ability to completely overhaul rendering.
- Has sandboxing solutions for both GDScript (godot-sandbox) and Lua (luau-gdextension) that could enable safe client-side mod execution. This is probably the biggest win for client-side mods, as it gives mod authors more capabilities out of the box.
- Editor-imported assets are treated the same way as assets loaded at runtime. Runtime asset loading feels better in general.
- glTF is natively supported.
- Making and theming UI is super easy.
- It's significantly easier to build server-driven UI for future server mods because UI can be easily and cleanly constructed in code.
- The editor starts and works faster.
- It's a regular .NET SDK: it can be added to any .NET solution, other .NET projects can be referenced freely, NuGet is supported, and the latest .NET and C# versions are supported.
- Out-of-the box localization solution.
- Autoloads and shader globals are nice coding QoL features.
- Git works better with Godot.
- Open source and completely free.

Cons:
- Less capable in 3D.
- Smaller community and fewer third-party solutions.
- Unity is more mature.
- No real alternative to Unity's Editor Scene view. Right now, Godot only offers you a way to view and modify the running game's scene tree, with the ability to override/take control of the camera inside the game.
- Despite Unity's Editor being slower, it feels more polished overall.

Things I haven't researched and tried yet are animations, rigging and effects.

I'll publish Godot prototype branch shortly.

And I'd really like to hear your guys' opinions. Would you still be interested if the project were running on Godot instead of Unity?
i was doing godot project few months ago before i migrate to cmake builds, and bgfx/rmlui which gave me more powerful solution for cross platforms
i faced few issues with godot of fps drops while walking , i used to load client stuff as it , just tables been converted to json data
setup ui was super fast to match my default game and gave me better feature on some forms like exchanger etc
i left proejct for now but i plan to go back for it later
1789657399828.webp
 
Performance is a valid point. Right now both Unity client and Godot ones render Argent with ~147k tiles loaded in stable 100-120 FPS. This is too much for real gameplay, my converted map format consists of 64x64 tile chunks instead of original's 8x8 and the streaming radius is too big as well.
But that's excluding rigged characters, particles and effects, just terrain, water and scene objects. I surely want to tests that before committing to Godot migration.

From my initial research Godot is suffering performance issues with rendering UI elements that are positioned in world space like character name plates, HP bars etc, but that can be worked around.

i used to load client stuff as it
This can potentially cause performance issues if conversion from the original geometry format is done at the moment when object is loading to the scene. This is one of the reasons I want to use glTF in this projects as engines are optimized for loading it. But it simply solvable with engine-ready bytes cache - the first time you convert original model into engine's type (like MeshData in Unity) you can serialize and store the result. The next time you need that model the load will be cheap as it will skip conversion step.

setup ui was super fast to match my default game and gave me better feature on some forms like exchanger etc
That's true, I enjoyed building UI with it as well!
 
ye that why i used baked map 64x64 chunks
and converted all models and effects into tscn type of godot
but that was done before i work with bgfx now should be easier as i solve all converting issues

player pallet was annoying in general but now suppose to be easier specially with astra ai