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