NNabeel Hassan

Blog · October 15, 2026 · 8 min read

How to Upgrade the Unity Version of a Live Project Without Breaking It

By Nabeel Hassan — AI Engineer · ICPC World Finalist

TL;DR: Upgrading the Unity version of a project that real people are using is not a menu click, it is a small migration project. The editor upgrade itself is usually the easy part. What breaks is everything around it: packages that moved, render pipeline and input changes, native plugins, platform SDK requirements, and behaviour that changed without an error. My approach, after more than five years of Unity work across AR platforms, cross-platform SDKs and a live sports-tech product, is simple: upgrade on a branch, one major step at a time, with a known-good build to compare against, and ship the result through the same staged release you would use for a risky feature. Never upgrade and add features in the same release.

Every Unity project eventually has the conversation. The current editor version is getting old, a store or platform requirement is coming, a package you need only supports newer versions, or a bug you keep hitting is fixed upstream. Someone says "let's just upgrade", and a week later the team is staring at a build that compiles fine and behaves subtly differently on one device.

I have done this on projects I started and, more often, on projects I inherited, including as CTO at RAQTS, where the Unity layer was part of a live product with players and facilities depending on it. This is the process I use.

Why Unity upgrades are riskier than they look

On a web project, a framework upgrade mostly fails loudly. Types break, tests fail, the build stops. Unity fails quietly far more often, for a few structural reasons.

That last point is the real danger. A compile error is cheap. A change in feel that reaches users is expensive, because nobody notices it in the editor.

Step 1: decide why you are upgrading, and to what

"Newer is better" is not a reason. A good reason is specific: a store requirement, a platform SDK you need, a package that will not install otherwise, or a fixed bug that is costing you. The reason sets the target.

My default target is the latest long-term support release that satisfies the reason, not the newest version available. LTS releases get fixes for longer and change less underneath you. For an interactive product that has to work every night, boring is a feature.

Write the reason down. When the upgrade gets painful halfway through, and it usually does, a written reason is what stops the team from either abandoning it or quietly expanding it into a rewrite.

Step 2: get a known-good baseline before touching anything

Before upgrading, I want to be able to answer one question at any point: is this different from what we had?

That means:

Without a baseline, every report after the upgrade turns into an argument about whether it "was always like that". With one, you install both builds side by side and look.

Step 3: audit what will break before it breaks

An hour of reading saves days of debugging. Before opening the project in the new editor, I list:

Anything with no compatible version is a decision before the upgrade starts, not a surprise halfway through. Sometimes the honest answer is that an abandoned plugin has to be replaced first, as its own piece of work. This is the same audit habit I use when inheriting a codebase in the first week: find the thing nobody owns before it finds you.

Step 4: upgrade on a branch, one major step at a time

The mechanics I follow:

  1. Create a dedicated branch. Nothing else lands on it except the upgrade.
  2. Close the editor, clear the Library folder, and open the project in the new version so the reimport is clean.
  3. Commit the automatic changes on their own, before fixing anything. That commit is the editor's work. Everything after it is yours, and reviewers can tell the two apart.
  4. Fix compile errors, then warnings that mention obsolete APIs. Deprecation warnings are next year's compile errors.
  5. Jump one major version at a time if you are several behind. Skipping straight across many versions stacks every migration into one unreadable diff.

Keep the branch short-lived. A long-running upgrade branch fights every feature merged in the meantime, and resolving merge conflicts in scene and prefab files is one of the least pleasant jobs in Unity.

Step 5: test on devices, not in the editor

The editor is the place where upgrades look fine. Real devices are where they are not.

I test the upgraded build against the baseline on the same physical devices, side by side, walking the written flows. Things I specifically look for:

For AR work, this means testing in real conditions rather than at a desk. The lessons in field testing AR apps apply directly, because tracking changes from a package update rarely show up indoors under good light.

Step 6: ship it like a risky feature

An engine upgrade is one of the riskiest releases a Unity product makes, and it deserves the same care as one.

On mobile you cannot roll back a shipped build the way you roll back a web deploy. The store review cycle is the real constraint, so the testing bar before submission has to be higher than it feels necessary.

How often to upgrade

The cheapest upgrade is a small one. A project that moves to each new LTS within a few months of release does a series of manageable migrations. A project left for several years eventually faces one huge, risky jump, usually forced by a store deadline at the worst possible time.

My rule of thumb for live products: plan an upgrade at least once a year, schedule it during a quiet period, and treat it as maintenance in the roadmap rather than something squeezed between features. Platform requirements, such as Google Play raising the target API level it accepts, arrive on a calendar. It is better to be ahead of that calendar than chasing it.

The short version

None of this is glamorous, and that is the point. Upgrades that go well look like nothing happened. That outcome comes from treating a Unity upgrade as an engineering project with its own plan, rather than something a team does on a Friday afternoon.


I build Unity, AR and XR products and lead engineering as a fractional CTO, from AR platforms at ARCortex and cross-platform SDKs at Geonode to a live sports-tech product at RAQTS, alongside AI agents for founders across the US, UK and Europe. If your Unity project needs an upgrade or a steady pair of hands, more about my work here, or book a call.

FAQ

Should I upgrade my Unity project to the latest version?

Upgrade when you have a specific reason, such as a store or platform requirement, a package that needs a newer editor, or a bug fixed upstream. For a live product, target the latest LTS release that satisfies that reason rather than the newest version available, because LTS releases change less and receive fixes for longer.

Can I skip several Unity versions in one upgrade?

You can, but it is safer to move one major version at a time. Each step has its own package and API migrations, and stacking them into one jump produces a diff too large to review and makes it hard to tell which change caused a regression.

What usually breaks when upgrading Unity?

The editor upgrade itself is rarely the problem. Breakage usually comes from packages that need new versions, native plugins and third-party SDKs, custom shaders written for an older render pipeline, input handling, and Android or iOS build settings. Some changes, like lighting or performance differences, cause no errors at all, which is why device testing against a baseline build matters.

How often should a live Unity project be upgraded?

Plan at least one upgrade a year, ideally moving to each new LTS within a few months of release and during a quiet period. Small regular upgrades are far cheaper than one large forced jump when a store deadline arrives.

Building something in this space?

I take on AI-agent, automation and product work directly — scoped fast, shipped fast.

Book a discovery call →

Keep reading