【发布时间】:2015-02-28 22:20:01
【问题描述】:
我目前正在尝试在 Unity 中制作的游戏中使用 Singleton 作为任务组织的全局数据结构。
我的Singleton类代码如下:
public class TaskManager : MonoBehaviour
{
private List<Task> Tasks;
private static TaskManager instance;
private TaskManager()
{
Tasks = new List<Task>();
}
public static TaskManager Instance
{
get
{
if(instance == null)
{
instance = new TaskManager();
}
return instance;
}
}
}
我将此示例用作我的课程的基础: https://msdn.microsoft.com/en-us/library/ff650316.aspx
但是,问题是,当我尝试在不同的脚本中访问 TaskManager 时,值没有得到保存。
例如,我在一个脚本中:
TaskManager tm = TaskManager.Instance;
Task newTask = new Task();
tm.PushTask(newTask);
print(tm.GetTaskList().Count);
通过这个我可以看到TaskManager的计数为1,显示了新任务。
然后我的其他脚本尝试从 TaskManager 读取:
TaskManager tm = TaskManager.Instance;
List<Task> l = tm.GetTaskList();
print(l.Count);
当我这样做时,Count返回为0,表明上面的世界任务还没有保存到TaskManager中。
我很确定这个错误是由于我误解了如何使用 Singletons 造成的。我需要为 TaskManager Instance 实现一个 set 属性吗?还是我犯了另一个错误?
谢谢!
编辑:
PushTask() 代码如下:
public void PushTask(Task t)
{
Tasks.Add(t);
}
【问题讨论】:
-
能否提供
PushTask()方法代码? -
当然可以。我在底部添加了它。
-
你的单身没问题,所以问题肯定出在其他地方。根据this problem solution,如果您正在更改场景并希望将任何数据保留在静态实例中,则应使用
DontDestroyOnLoad标记您的单例类。 -
嗯,不过,我不会改变场景。这是同一个场景,只是通过不同的脚本访问。
-
实际上,如果你只想要一个单例,你不应该从
MonoBehaviour继承,如果你需要它成为场景中的一个对象(例如在更新上运行),你需要创建一个GameObject,将其设置为DontDestroyOnLoad并将您的实例作为组件添加到其中。你不应该new SomeComponent(),Unity 以不同的方式处理组件(和一般的UnityEngine.Object),它将接管你的内存管理。
标签: c# unity3d singleton unity3d-2dtools