Skip to content

How to avoid "Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)" #17

Open
@KamilDev

Description

@KamilDev

I think it's needed to unsubscribe from events in OnDestroy to prevent memory leaks, such as:

private void OnDestroy()
{
    if (StatsManager.Instance != null)
    {
        StatsManager.Instance.OnStatsChanged -= OnStatsChanged;
    }
}

This works, except for when exiting play mode, sometimes it will log:

Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)

I believe it's because:

  • Unity destroys StatsManager first.
  • Unity next destroys the other GameObject that unsubcribes from StatsManager event.
  • When checking StatsManager.Instance != null, it causes StatsManager to respawn since StatsManager.Instance is null. (Internal Singleton behavior)

What's the best way to avoid this issue?

Activity

hasanbayatme

hasanbayatme commented on Feb 28, 2025

@hasanbayatme
Member

I think a simple way to avoid this is to have a method to check whether there is any existing instance there without calling the get accessor on the Singleton class that initializes a new instance if there aren't any.

You could try it in your local.copy and see how it performs, like add a new method/property that just checks the internal instance field
of the singleton for null, and returns:

public bool HasInstance => instance != null;

This way, when you're unsubscribing for an event if the object is already destroyed, then no new object gets initialized by the singleton, as you're using the HasInstance in place of Instance in OnDestroy.

This should be only intended to be used in such cases as of OnDestroy or OnDisable where the instance it self could be destroyed due to Unity unloading the scene.

self-assigned this
on Feb 28, 2025
added theissue type on Feb 28, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

    Development

    No branches or pull requests

      Participants

      @hasanbayatme@KamilDev

      Issue actions

        How to avoid "Some objects were not cleaned up when closing the scene. (Did you spawn new GameObjects from OnDestroy?)" · Issue #17 · UnityCommunity/UnitySingleton