我有一位"经理"我的场景中的GameObject附加了Manager
脚本组件。
我需要这个Manager
脚本成为单身,因为没有多少经理可以理解。
我使用了单例实现from the Unity wiki。
我有两个问题:
GameObject.AddComponent<T>()
来实例化单例?为什么不做new T()
?protected
和Singleton
类构造函数Manager
。除了他们自己,没有人能够实例化这些类。 Unity Editor如何实例化它们?答案 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。