C# 在重新加载场景时,如何使Singleton MonoBehavior类的实例以新的形式开始?

C# 在重新加载场景时,如何使Singleton MonoBehavior类的实例以新的形式开始?,c#,singleton,unity3d,scene,C#,Singleton,Unity3d,Scene,我有一个“SingletonManager”类,其中有一个“LevelManager”singleton实例(及其接口)。“LevelManager”游戏对象不应在应用程序的整个生命周期内保持不变,而应在每次加载新级别时用新实例替换 在运行我当前的代码时,当第二次加载场景时,“LevelManager”似乎丢失了,尽管场景中有游戏对象(附带脚本)。我意识到这可能是因为我仍在尝试访问旧的引用 确保我的“SingletonManager”在每次加载新级别时都保存“LevelManager”的新实例的

我有一个“SingletonManager”类,其中有一个“LevelManager”singleton实例(及其接口)。“LevelManager”游戏对象不应在应用程序的整个生命周期内保持不变,而应在每次加载新级别时用新实例替换

在运行我当前的代码时,当第二次加载场景时,“LevelManager”似乎丢失了,尽管场景中有游戏对象(附带脚本)。我意识到这可能是因为我仍在尝试访问旧的引用

确保我的“SingletonManager”在每次加载新级别时都保存“LevelManager”的新实例的最佳方法是什么

我的代码(删除不相关项):

单音管理器:

public class SingletonManager
{
    private static LevelManager instance;
    public static ILevelManager Instance
    {
        get
        {
            if (this.levelManager == null)
            {
                this.levelManager = GameObject.FindObjectOfType(typeof(LevelManager)) as LevelManager;
            }
            return this.levelManager;
        }
    }
}
Singleton不是持久的:

public class Singleton<Instance> : MonoBehaviour where Instance : Singleton<Instance> {
    public static Instance instance;
    public bool isPersistant;

    public virtual void Awake() {
        if(isPersistant) {
            if(!instance) {
                instance = this as Instance;
            }
            else {
                DestroyObject(gameObject);
            }
            DontDestroyOnLoad(gameObject);
        }
        else {
            instance = this as Instance;
        }
    }
}
公共类Singleton:monobhavior,其中实例:Singleton{
公共静态实例;
公共图书馆;
公共虚拟空唤醒(){
如果(isPersistant){
如果(!实例){
实例=此为实例;
}
否则{
销毁对象(游戏对象);
}
DontDestroyOnLoad(游戏对象);
}
否则{
实例=此为实例;
}
}
}

我从你的问题中了解到的是,你需要一个新的对象,因为游戏阶段正在改变
如果我理解正确,这可能会对你有所帮助
尝试多音模式以获得您的解决方案。
下面是一个示例

类级别管理器{
私有静态只读字典_实例=新字典();
私人经理(){
}
publicstaticlevelmanager GetInstance(对象键){//阶段的唯一键
锁(_实例){
levelManager实例;
if(!\u instances.TryGetValue(key,out实例)){
instance=newlevelmanager();
_实例。添加(键,实例);
}
返回实例;
}
}
}
注意:-我只是给你举一个例子,它不是适合你的类的完美代码
参考链接:

简单解决方案:

为级别管理器创建一个管理器。它应该是持久的,并且有一个LevelManager预置数组(我假设您是从预置实例化它们的?)。加载每个级别时,让它生成适当的LevelManager预制(或构建它或创建它所需的任何东西)

每个级别管理器只需将实例设置为唤醒,并让级别在最后销毁它。(即,你的非持久性单身汉。)


您的意思是每次阶段更改时都需要新的levelManager对象?我紧张吗?
class levelManager {
    private static readonly Dictionary<object, levelManager> _instances = new Dictionary<object, levelManager>();

    private levelManager() {
    }

    public static levelManager GetInstance(object key) { // unique key for your stage
        lock (_instances) {   
            levelManager instance;
            if (!_instances.TryGetValue(key, out instance)) {
                instance = new levelManager();
                _instances.Add(key, instance);
            }
            return instance;
        }
    }
}
public class LevelManagerSpawner
{
    public GameObject[] LevelManagerPrefabs;

    void OnLevelWasLoaded( int levelNumber )
    {
        Instantiate( LevelManagerPrefabs[ levelNumber ] );
    }
}