4

我有一个带有“LevelManager”单例实例的“SingletonManager”类(及其接口)。'LevelManager' GameObject 不应该在整个应用程序生命周期中保持不变,并且应该在每次加载新关卡时替换为新实例。

在运行我当前的代码时,当第二次加载场景时,“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;
        }
    }
}

单例,不是持久的:

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;
        }
    }
}
4

2 回答 2

1

我从您的问题中了解到的是,随着游戏阶段的变化, 您需要一个新对象,
如果我理解正确,那么这可能会对您有所帮助。
为您的解决方案尝试Multiton 模式
这是一个例子

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;
        }
    }
}

注意:- 我只是给你一个例子,你的课程不是完美的代码
参考链接:http ://en.wikipedia.org/wiki/Multiton_pattern

于 2013-09-17T12:46:32.783 回答
0

简单的解决方案:

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

每个关卡管理器都应该简单地将实例设置为 Awake,并让关卡在最后将其销毁。(即你的非持久单身人士。)

public class LevelManagerSpawner
{
    public GameObject[] LevelManagerPrefabs;

    void OnLevelWasLoaded( int levelNumber )
    {
        Instantiate( LevelManagerPrefabs[ levelNumber ] );
    }
}
于 2013-09-19T14:11:56.010 回答