Unity 中单例是什么以及用法
这是个老生常谈的问题,静态和单例到底有没有区别!感觉上他们好像都一样!
但是,静态编译期就会编译进去,游戏开始了,就会一直在内存里,你游戏不结束他也不结束,如果你内存吃紧,而他又很大的时候,那他就很麻烦。
而单例不一样,你不用他他就不出现,你需要了他就来了,等你不想要他了你把他扔了销毁就行了。
很灵活是不是,但他也会有问题,如果我们没有把它初始化,就用它了那你的游戏就报错了,我们可能没法很好的去把控他初始化的时机,不过这个问题在现在这个时代看已经不是什么大问题了,至少我用unity都是awake的时候就加载了反正也没多大~我们需要使用单例的情况往往是,我们有一个管理器,它内部需要维护自己的状态,我们在游戏初始化的时候就创建他,然后我们通过它来创建游戏对象或者说是其他的东西,并持续管理来完成增删查改的功能。
但也有问题比如说我们有个对象池他是单例,很多类都和他有交互,如果有一天这个你池子出问题了,那么你Debug的时候就会很痛苦,尤其是当这个池子还有其他与他关联的脚本不是你写的时候,你就要把所有的脚本都读懂,才能知道bug出在哪里,是不是很恐怖?但如果不使用,那我们就会很轻松了,我们只需要理解这个类就ok了。更多的情况下我会认为单例适合当我内部需要维护一系列对象状态,并且你需要在合适的情况下再去用它而不是盲目的去疯狂单例,是个管理器就单例。我们可以根据当前恩需求,与未来的可维护性适当的去选择是否使用他。静态对我来说更像一个方法的提供者,比如说数学库,帮我做个加法然后返回结果,它内部并没有什么状态在维护,仅仅只是帮我做点事,就是个工具人。
用法 :直接通过类名.Instance就可以 例如:Demo.Instance.a;
创建单例
public class Demo : MonoBehaviour {
public static Demo Instance;
void Awake()
{
Instance = this;
}
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
}
}