Unity wiki&Singleton如何运作?

时间:2017-04-28 13:58:16

标签: c# unity3d unity5

我有一位"经理"我的场景中的GameObject附加了Manager脚本组件。

我需要这个Manager脚本成为单身,因为没有多少经理可以理解。

我使用了单例实现from the Unity wiki

我有两个问题:

  1. 为什么要创建一个新的GameObject,然后使用GameObject.AddComponent<T>()来实例化单例?为什么不做new T()
  2. 我有protectedSingleton类构造函数Manager。除了他们自己,没有人能够实例化这些类。 Unity Editor如何实例化它们?

1 个答案:

答案 0 :(得分:3)

正如评论所说:

MonoBehaviour类无法与new T()实例化,因为GameObject组件的工作方式是: 必须 附加到GameObject!因此,GameObject类提供了一种实例化附加到该GameObject的新MonoBehavi的方法:AddComponent<T>()可能通过反射操作(其他MonoBehaviour方法,如Start()Update() {{3} },而不是运行期间的每一帧,但它很容易进行比较;它是不透明和神奇的,并且具有重要的开销,所以它也可能是反射)。

防止构造函数被调用可能只会破坏一切,所以不要再费心去保护它了。由于AddComponent的工作方式,通过反射调用构造函数,您实际上无法阻止创建新实例,但您可以检测到它发生了并执行了一些操作。我喜欢的方法是脚本“哦,一个实例已经存在,而不是我”并且自我毁灭。

此外,由于组件可能需要其他组件(RigidBody也需要通过属性指定的Collider,MonoBehaviours aren't exactly invoked with reflection),当调用AddComponent<T>()添加一个组件时,它将搜索class属性,以查看是否指定了任何[RequireComponents]并自动添加它们。这将完成can specify their own requirements