编程语言
首页 > 编程语言> > C#-Unity Wiki的Singleton如何工作?

C#-Unity Wiki的Singleton如何工作?

作者:互联网

我的场景中有一个“ manager” GameObject,并附加了一个Manager Script组件.

我需要这个Manager脚本是一个单例,因为没有几个经理是没有意义的.

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

我对此有两个问题:

>为什么要创建一个新的GameObject,然后使用GameObject.AddComponent< T>()来实例化单例?为什么不只是新建T()?
>我已经保护了我的Singleton和Manager类构造函数.除了他们自己,没有人应该能够实例化这些类. Unity编辑器如何实例化它们?

解决方法:

正如评论所说:

由于GameObject组件的工作方式,不能用新的T()实例化MonoBehaviour类:它们必须附加到GameObject上!这样,GameObject类提供了一种实例化连接到该GameObject的新MonoBehaviour的方法:AddComponent< T>()可能通过反射进行操作(其他MonoBehaviour方法,例如Start()和Update()aren’t exactly invoked with reflection,而不是运行时的每个帧) ,但比较起来很容易;它几乎是不透明和神奇的,并且开销很大,因此也很可能是反射).

完全阻止构造函数被调用可能只会破坏所有内容,因此不要费心去尝试保护它.由于AddComponent的工作方式(通过反射调用构造函数),您实际上不能阻止创建新实例,但是您可以检测到它发生并采取措施.我的首选方式是脚本运行“哦,实例已经存在,但不是我”并销毁了自己.

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

标签:unity5,unity3d,c
来源: https://codeday.me/bug/20191111/2019812.html