gpt4 book ai didi

c# - 在 Unity3D 中使用单例

转载 作者:行者123 更新时间:2023-11-30 14:28:42 24 4
gpt4 key购买 nike

我目前正尝试在我用 Unity 制作的游戏中使用单例作为任务组织的全局数据结构。

我的单例类代码如下:

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

我用这个例子作为我类(class)的基础: 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。

我很确定错误是由于我误解了如何使用单例造成的。我是否需要为 TaskManager 实例实现一个设置属性?还是我犯了另一个错误?

谢谢!

编辑:

PushTask()代码如下:

public void PushTask(Task t)
{
Tasks.Add(t);
}

最佳答案

就我个人而言,我认为您选择的解决方案并不完美。有一段时间,我尝试使用不从 MonoBehaviours 继承的“抽象”类来将逻辑与 Unity 机制分离——但发现这会使代码变得臃肿和不必要的复杂。事实上,根据我的经验,每个不仅包含数据而且有自己的逻辑的类迟早会成为 MonoBehaviour。

因此,我不是从 MonoBehaviour 中移除继承,而是通过实现通常的 MonoBehaviour 单例模式来解决它:

using UnityEngine;

public abstract class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
public static T Instance { get; private set; }

protected virtual void Awake()
{
if (Instance == null)
{
Instance = (T) this;
}
else
{
Debug.LogError("Got a second instance of the class " + this.GetType());
}
}
}

然后从它继承你的类。

关于c# - 在 Unity3D 中使用单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28787639/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com