【发布时间】:2017-04-28 13:58:15
【问题描述】:
我的场景中有一个“管理器”游戏对象,并附加了一个 Manager 脚本组件。
我需要这个Manager 脚本是一个单身,因为有多个经理是没有意义的。
我使用了单例实现from the Unity wiki。
我有两个问题:
- 为什么它会创建一个新的GameObject,然后使用
GameObject.AddComponent<T>()来实例化单例?为什么不直接new T()? - 我的
Singleton和Manager类构造函数都有protected。除了他们自己之外,没有人应该能够实例化这些类。 Unity 编辑器如何实例化它们?
【问题讨论】:
-
您不能实例化派生自 Unity 内部
MonoBehaviour类的对象。这就是new T()不起作用的原因。 -
我使用 Unity wiki 中的单例实现 - 将 您的代码 的相关部分添加到您的问题中会有所帮助
-
请注意,您不应为继承自
MonoBehaviour的类定义构造函数 - 请改用 Start()/Awake()/OnEnable() 方法。 -
至于 Unity 编辑器如何将它们实例化?,大概是通过反射。即使一个类有
private或protected构造函数,你仍然可以使用反射找到构造函数和Invoke它。