Open
Description
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 causesStatsManager
to respawn sinceStatsManager.Instance
is null. (Internal Singleton behavior)
What's the best way to avoid this issue?
Metadata
Metadata
Assignees
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
hasanbayatme commentedon Feb 28, 2025
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
fieldof the singleton for null, and returns:
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 ofInstance
in OnDestroy.This should be only intended to be used in such cases as of
OnDestroy
orOnDisable
where the instance it self could be destroyed due to Unity unloading the scene.