未定义 你还是没太理解unity中组件是怎么创建的。
你应该记得很多地方看到过或课程中学过,继承mono的类叫unity的组件,或叫脚本组件
。
脚本组件是不能new 来创建脚本的实例的,而是:
当你把脚本挂到了gameObject游戏物体上,或者用AddComponent方法挂到游戏物体上。 才会由引擎帮你创建这个脚本组件的实例,并建立这些组件实例与游戏物体的组件关系。提供了GetComponent方法,可以通过游戏物体来获取到挂到此物体上的脚本组件的实例。
理解了上面这些内容,你就能明白,比如一个典型的手动挂到游戏物体上的单例,他只是通过awake方法指定你总得获取到唯一一个组件实例,从而达到了脚本组件单例的目的。
using UnityEngine;
// 单例基类,这是要手动挂载到GameObject上的脚本
public class SingletonMono<T> : MonoBehaviour where T : MonoBehaviour
{
private static T _instance = null;
public static T Ins => _instance;
public virtual bool DontDestroy => false;
protected void Awake()
{
// 注意&与&&区别
if (_instance != null & _instance == this)
return;
_instance = this as T;
if(DontDestroy) DontDestroyOnLoad(gameObject);
}
void OnDestory()
{
if (_instance == this)
{
_instance = null;
}
}
}
比较难理解的是,如果我们在很多个游戏物体上都挂上上面这个单例脚本,那实际上引擎会在每个个游戏物体加入到场景中时,都创建一份此脚本的实例。但是当我们用Ins 来获取单例脚本实例时, 获得和使用的始终只能是第一个物体加入到场景时创建的此脚本的实例。
结论:
- 可见这种手动挂到物体上的单例脚本,只是结果上的始终唯一的脚本单例。过程上还是创建了很多此脚本的实例(如果给很多物体手动挂此脚本的话),只是放在内存中不获取他们也不使用他们。
- 只有上面 @Rita 的回复中给出的参考代码是在静态的get方法中用代码给物体添加脚本组件,这种方式的脚本单例,才是过程与结果都唯一的脚本单例。