Hello,各位小伙伴,上一篇结束以后,Unity里的UGUI系列分享就已经结束了,不知道大家是否已经灵活掌握运用了呢?
之后的内容会给大家分享一些所谓的干货,都是实战必备。
今天给大家分享一下,Unity里的单键模式。那么什么是单键模式呢?
单键模式(Singleton)要求一个类有且只能有一个实例。在Unity里,这个实例可以依赖也可以不依赖于GamoObject。并且这个实例对外提供一个全局的访问变量,在同一时刻只能被一个线程所访问。
在实际项目中,我们很多时候都需要用到单键,代码的类型标记为Static静态类型,只要能拿到类的地方,全局均可访问使用,从项目开始到结束,除非手动释放置空(依赖于GameObject的单键可以被标记跨场景删除),不然不会被清除,这就是单键。
那么进入今天的正题
前面介绍过,Unity里的单键可以依赖也可以不依赖于GameObject。而且大家需要谨记一件事,继承于MonoBehaviour的类是不能够通过new的形式去创建对象的,这个大家要谨记。避免不要的bug和空值。
好了,先给大家介绍不依赖于GameObject的单键。
一、不依赖于GameObject的单键
我们在Unity里创建一个脚本,名为SingletonTest1
打开脚本,然后定义一个私有的静态对象并且置空,如下图,static代表静态对象类型,=null代表设置为空对象
因为我们先介绍不依赖于GameObject的单键,所以这里我们把类的继承关系去掉。如下图,删除对MonoBehaviour的继承
然后我们在创建一个提供给外部访问的实例静态对象,如下图,我又创建了一个静态类的实例对象,但是是Public的,用于提供给外部访问
如上图,我在Instance的位置加了{ get{} },Instance本身并不是一个函数,而是一个变量,如果是函数都需要带括号()进行声明,这里是一个大括号{}声明的,这个大家可以区分一下,不要混淆。这里是C#对变量的一种特殊操作方式,可以用关键特性get和set进行取值和赋值。
我们这里因为要当成提供给外部使用的实例对象,所以这里使用Get进行外部取值。
然后对取值进行完善,并且不依赖于GameObject,直接通过new的方式创建一个类的对象赋值即可,记住上面说的一点,继承MonoBehaviour的对象不能通过new的方式创建。
这样就完成对不依赖于GameObject的单键类的创建,然后我们随便公开一个方法输出一句日志,再创建另外一个调用脚本来测试一下对这个单键类的使用。
如下图,我们在调用SingleTonTest1的时候,是点出来一个Instance,即我们单键类提供给外部使用的唯一一个静态实例对象,再通过该实例对象,访问单键类的内部函数和变量。
然后我们将这个LogSingleTon脚本挂载到一个空场景的摄像机上,运行即可查看效果。
如上图所示,运行后我们的调用单键类里的日志可以被正常打出,并且Hierarchy面板里没有其他的对象生成,这就完成了我们对第一种单键对象的创建和使用。
接下来介绍第二种单键对象的创建和使用方法,就是依赖于GameObejct的。
二、依赖于GameObject的单键
第二种方法是依赖于GameObject的单键对象创建方式,我们依然创建一个测试脚本,并且命名为SingleTonTest2。
然后依然打开脚本,创建一个私有的和公开的静态类对象,和之前一样
因为我们第二种演示方式需要依赖于GameObject,所以我们就不删除对MonoBehaviour的继承了,然后来完善对外部获取单例对象的实现。
OK,这样就完成了依赖于GameObject的单键对象的创建,然后我们继续创建一个测试方法提供给外部调用使用。
切回到Unity再次运行项目,就可以看到俩种单键模式的日志输出了,如下图,俩种单键模式的日志都已经输出了,并且第二种依赖于GameObject的单键模式会在Hierarchy面板里创建一个我们命名为SingleTonTest2的对象,上面挂载了我们的SingleTonTest2的脚本组件。
前面提到,依赖于GameObject的单键对象,可以通过标记来实现跨场景之后不销毁,怎么做呢?其实就是加一句话就可以了。
好了,以上就是俩种不同的单键模式的创建和使用,希望大家能对单键模式有一个正确的理解。
后续开始会陆续进行Unity实战的干货分享,不管你是不是零基础入门,只要跟着来,就一定可以学的会。
大家下期见 ヾ( ̄▽ ̄)Bye~Bye~
本文分享自 韩东吉的Unity杂货铺 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!