DEV Community

Samcorp
Samcorp

Posted on

Migrating a Project From Unity to Godot: An Honest Post-Mortem

Migrating a Project From Unity to Godot: An Honest Post-Mortem

Migrating a game from Unity to Godot sounds straightforward on paper.

GameObjects → Nodes
Prefabs → Scenes
C# → GDScript or C#
Unity APIs → Godot APIs
Enter fullscreen mode Exit fullscreen mode

Then you start doing it.

And quickly realize:

An engine migration isn't really a migration. It's a partial rewrite.

That was the biggest lesson from approaching a Unity to Godot migration.

Here's what actually matters before deciding whether the move is worth it.


Why Move in the First Place?

Changing engines is expensive, so there needs to be a real reason.

Possible motivations include:

Open-source requirements
Licensing preferences
Smaller project requirements
Faster iteration
Different deployment targets
Simpler tooling
Team preference
Long-term engine strategy
Enter fullscreen mode Exit fullscreen mode

But:

“Godot looks interesting.”

isn't enough reason to migrate a project halfway through production.

Before moving anything, ask:

What problem does changing engines solve?
Enter fullscreen mode Exit fullscreen mode

If the answer isn't clear, staying with Unity may be cheaper.


The First Mistake: Trying to Translate Unity Directly

Initially, the natural instinct is:

Unity GameObject
      ↓
Godot Node

Unity Prefab
      ↓
Godot Scene

MonoBehaviour
      ↓
Godot Script
Enter fullscreen mode Exit fullscreen mode

Conceptually, those comparisons help.

Architecturally, they're dangerous.

Godot revolves heavily around a scene tree composed of nodes, while reusable scenes can themselves be instantiated inside other scenes.

So instead of recreating the Unity hierarchy exactly, we should rethink it.

For example:

Player
├── CharacterBody
├── Camera
├── Weapon
├── Animation
└── Collision
Enter fullscreen mode Exit fullscreen mode

The migration became easier once the question changed from:

“How do I reproduce this Unity prefab?”

to:

“How should this gameplay object naturally exist in Godot?”


Don't Port Every Script Line by Line

Consider typical Unity code:

public class Player : MonoBehaviour
{
    void Update()
    {
        transform.position +=
            Vector3.forward * speed * Time.deltaTime;
    }
}
Enter fullscreen mode Exit fullscreen mode

The gameplay idea transfers.

The implementation does not necessarily need to.

Engine APIs affect:

Input
Physics
Animation
Navigation
Audio
UI
Resources
Scene loading
Lifecycle methods
Enter fullscreen mode Exit fullscreen mode

Trying to preserve every abstraction from Unity can leave you with a Godot project that still thinks like Unity.

That's usually the worst of both worlds.


Decide Early: C# or GDScript?

This became one of the most important decisions.

Keeping C# has obvious advantages:

Existing team knowledge
Reusable pure C# logic
Static typing
Familiar tooling
Less language retraining
Enter fullscreen mode Exit fullscreen mode

But GDScript integrates naturally with Godot's workflow and API.

So instead of automatically rewriting everything, separate the project into:

ENGINE-INDEPENDENT LOGIC
+
ENGINE-DEPENDENT LOGIC
Enter fullscreen mode Exit fullscreen mode

Pure gameplay calculations may be reusable.

A script tightly coupled to:

MonoBehaviour
GameObject
Transform
Physics
Animator
Unity Input
Enter fullscreen mode Exit fullscreen mode

probably requires much more work.


Assets Were Easier Than Systems

Moving:

Textures
Models
Audio
Fonts
Basic animations
Enter fullscreen mode Exit fullscreen mode

was generally conceptually simpler than moving:

Shaders
Physics behavior
UI
Input
Animation controllers
Custom editor tools
Third-party plugins
Enter fullscreen mode Exit fullscreen mode

That's an important distinction when estimating migration effort.

Don't estimate:

"We have 300 assets."
Enter fullscreen mode Exit fullscreen mode

Estimate:

"We have 12 engine-dependent systems."
Enter fullscreen mode Exit fullscreen mode

Those systems usually determine the real migration cost.


Third-Party Plugins Can Become the Hidden Blocker

A Unity project may depend on packages for:

Analytics
Ads
Payments
Multiplayer
Authentication
Save systems
Platform SDKs
Pathfinding
Editor tooling
Enter fullscreen mode Exit fullscreen mode

Before migrating, classify every dependency:

Has Godot equivalent     ✓
Can replace internally   ✓
Can remove               ✓
No replacement           ⚠
Enter fullscreen mode Exit fullscreen mode

Do this before rewriting the game.

Discovering halfway through migration that a critical platform SDK doesn't fit your Godot deployment plan can change the entire decision.

This is why engine choice should be evaluated against the game's platform and production requirements rather than preference alone. A mature Unity game development stack, for example, can already include established pipelines for mobile, WebGL, AR/VR, multiplayer, deployment, and platform optimization—capabilities that need to be accounted for before replacing the engine.


Physics Needs Retesting

Even when equivalent components exist, don't assume equivalent behavior.

After migration, test:

Character movement
Jumping
Slopes
Collision detection
Triggers
Rigid bodies
Projectiles
Vehicle behavior
Enter fullscreen mode Exit fullscreen mode

A controller tuned around one physics environment may feel slightly different in another.

And in games, “slightly different” can mean:

The movement doesn't feel right anymore.

Treat gameplay feel as something to reproduce through testing, not something guaranteed by matching values.


UI Took More Rebuilding Than Expected

UI systems tend to be tightly connected to their engine.

A Unity hierarchy such as:

Canvas
└── Panel
    ├── Button
    ├── Text
    └── Image
Enter fullscreen mode Exit fullscreen mode

doesn't become a good Godot UI simply by reproducing the hierarchy.

Godot's Control nodes, containers, anchors, themes, and layout behavior deserve their own implementation.

Rebuilding the UI intentionally was cleaner than forcing the old structure into the new engine.


What Actually Worked Well

The migration wasn't only friction.

Some things became pleasantly simple.

Godot's scene composition works nicely for reusable gameplay objects.

A structure such as:

Player.tscn
Enemy.tscn
Weapon.tscn
Projectile.tscn
HUD.tscn
Enter fullscreen mode Exit fullscreen mode

makes relationships between reusable pieces easy to understand.

For smaller projects especially, having gameplay objects represented as compact reusable scenes can make iteration comfortable.

Godot's open-source nature can also be attractive when control over the engine and licensing model is an important project requirement.


What I Would Do Differently

The biggest change would be:

Don't migrate the whole project first.

Build a vertical slice.

One level
+
One player
+
One enemy
+
Core UI
+
Save/load
+
Critical platform integration
Enter fullscreen mode Exit fullscreen mode

Then measure:

Development speed
Performance
Build size
Tooling gaps
Platform support
Plugin availability
Team productivity
Enter fullscreen mode Exit fullscreen mode

Only then make the migration decision.

A broader cross-platform game development strategy should make engine selection dependent on gameplay, performance goals, target platforms, budget, and long-term requirements rather than assuming one engine is universally better.


My Migration Checklist

Before attempting a Unity to Godot migration, I'd now check:

□ Why are we migrating?
□ Which platforms must remain supported?
□ Which Unity packages do we depend on?
□ Which systems require rewriting?
□ C# or GDScript?
□ Which assets transfer cleanly?
□ Which shaders need rebuilding?
□ How much UI needs rebuilding?
□ Are platform SDKs supported?
□ Have physics differences been tested?
□ Can we reproduce one vertical slice?
□ Is migration still cheaper than staying?
Enter fullscreen mode Exit fullscreen mode

That last question matters most.


Final Takeaway

The wrong mental model is:

UNITY PROJECT
     ↓
 CONVERTER
     ↓
GODOT PROJECT
Enter fullscreen mode Exit fullscreen mode

A more realistic model is:

UNITY PROJECT
     ↓
AUDIT
     ↓
EXTRACT REUSABLE ASSETS + LOGIC
     ↓
REBUILD ENGINE-DEPENDENT SYSTEMS
     ↓
VALIDATE VERTICAL SLICE
     ↓
GODOT PROJECT
Enter fullscreen mode Exit fullscreen mode

Moving from Unity to Godot can absolutely make sense.

But Godot isn't “open-source Unity,” and Unity isn't simply “commercial Godot.”

They encourage different workflows and have different ecosystems.

So the biggest lesson from a Unity to Godot migration is surprisingly simple:

Don't migrate the architecture. Migrate the game.

Keep the mechanics, assets, rules, and player experience that matter.

Then rebuild them in a way that makes sense for the new engine.

That's usually much healthier than trying to make Godot behave exactly like the Unity project you just left.

Top comments (0)