unity3d——单例模式,加载单例模式类问题
先看代码:
public class GameDataMgr
{
private static GameDataMgr instance = new GameDataMgr();
public static GameDataMgr Instance { get => instance;}
//构造函数
private GameDataMgr()
{
}
}
如果该单例模式没用挂载到任何地方 那么他会在什么时候加载到内存中呢?
如果GameDataMgr
类没有挂载在Unity编辑器中的任何一个GameObject上,并且没有被其他脚本直接引用,那么它的加载时机可能会变得不那么确定。然而,根据Unity的类加载机制和一般的编程实践,我们可以做出以下推断:
- 首次引用时加载:
- 最常见的情况是,当
GameDataMgr
类的静态成员(如Instance
属性)首次被引用时,Unity会加载该类。这意味着只要代码中的任何部分尝试访问GameDataMgr.Instance
,GameDataMgr
类就会被加载到内存中。
- 最常见的情况是,当
- 程序初始化阶段:
- 在Unity程序初始化阶段,Unity会加载一系列必要的类和资源。虽然
GameDataMgr
类没有挂载在GameObject上,但如果它在项目的某个部分被引用(例如,在另一个脚本中通过GameDataMgr.Instance
访问),那么它仍有可能在程序初始化阶段被加载。
- 在Unity程序初始化阶段,Unity会加载一系列必要的类和资源。虽然
- 动态加载:
- 如果
GameDataMgr
类是通过反射、动态加载或其他非直接引用的方式被加载的,那么它的加载时机将取决于这些动态加载代码的执行时机。然而,在大多数情况下,如果没有显式地编写动态加载代码,这种情况是不太可能发生的。
- 如果
- 未使用则不被加载:
- 如果
GameDataMgr
类在项目的任何地方都没有被引用,那么根据Unity的类加载机制,它可能不会被加载到内存中。这是因为Unity通常只会在需要时加载类,以避免不必要的内存和资源消耗。
- 如果
如下情况会被加载:
public class BKMusic : MonoBehaviour
{
private void Awake()
{
ChangeValue(GameDataMgr.Instance.musicData.bkValue);
ChangeOpen(GameDataMgr.Instance.musicData.isOpenBK);
}
}
调用 GameDataMgr.Instance.xx GameDataMgr 类就被加载到程序内存中 也就是说 他会自动new 如何执行 private 中的构造函数