我有一个'SingletonManager'类,其中包含'LevelManager'单例的实例(以及它的接口)。 'LevelManager'GameObject在整个应用程序生命周期中不应该是持久的,每次加载新级别时都应该用新实例替换。
在运行我当前的代码时,当第二次加载场景时,尽管游戏对象(附带脚本)在场景中,但“LevelManager”似乎丢失了。我意识到这可能是因为我仍在尝试访问旧的引用。
每次加载新关卡时,确保我的'SingletonManager'保存'LevelManager'的新实例的最佳方法是什么?
我的代码(删除了无关紧要):
SingletonManager:
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;
}
}
}
答案 0 :(得分:1)
我从你的问题中理解的是你需要一个新的对象,因为游戏阶段是变化,
如果我理解正确,那么这可能对你有所帮助。
尝试使用 Multiton pattern 作为解决方案
这是一个示例
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
答案 1 :(得分:0)
简单的解决方案:
为级别经理创建经理。它应该是持久的,并且有一系列LevelManager预制件(我假设你是从预制件中实例化它们的?)。加载每个级别后,让它生成相应的LevelManager预制件(或构建它或创建它所需的任何内容)。
每个级别管理员应该只在Awake中设置实例,并让级别在最后销毁它。 (即你的非持久单身人士。)
public class LevelManagerSpawner
{
public GameObject[] LevelManagerPrefabs;
void OnLevelWasLoaded( int levelNumber )
{
Instantiate( LevelManagerPrefabs[ levelNumber ] );
}
}