专栏首页韩东吉的Unity杂货铺零基础入门 24:Unity设计模式之单键模式

零基础入门 24:Unity设计模式之单键模式

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杂货铺(DeveloperJimin),作者:Jimin

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 零基础入门 23: UGUI ScrollView

    今天要分享的内容,是近期内关于UGUI的最后一篇,UGUI里的滚动视图ScrollView,后期的内容会根据项目实用的功能组件进行分享。

    韩东吉
  • 零基础入门 43:InputField虚拟键盘激活状态如何检查?

    Hello,大家好,我是Jimin 韩东吉,因为公司的项目在前一段时间处于紧急开发阶段和紧接着的一测二测,导致又是时隔很久不更,现在节奏稍微慢了下来,还是抽空回...

    韩东吉
  • 零基础入门 42:更新Unity2017快捷键清除日志

    Hello,之前在零基础入门系列里,有发过关于快捷键清除日志的文章,但是当时的Unity版本是Unity5.5,很多人和我说用起来都还蛮方便,但是随着2017的...

    韩东吉
  • 技术译文 | MySQL 8 中检查约束的使用

    本文来源:https://www.percona.com/blog/2020/10/02/how-to-use-check-constraint-in-mysq...

    爱可生开源社区
  • 从0.5到1写个rpc框架 - 2:远程服务调用(grpc)

    gRPC是Google开源的跨语言远程服务调用(RPC)框架,通信协议用的HTTP/2,数据传输默认用的protocol buffers(一种轻便高效的结构化数...

    acupt
  • 安全的移除ES节点

    想要安全的移除一个es节点,不改变分片的数量,100%不会引起数据丢失,即保证这个节点的所有数据被其他节点接收。然后停止这个节点的实例。

    HLee
  • 聊聊skywalking的HTTPAccessLog

    skywalking-6.6.0/oap-server/server-core/src/main/java/org/apache/skywalking/oap/...

    codecraft
  • 基于zookeeper leader选举方式一

    一,基本介绍 Curator Framework是一个针对zookeeper做的搞层次的API,极大地简化了zookeeper的使用。它基于zookeeper构...

    Spark学习技巧
  • Spring Cloud Eureka动态扩容

    前言 本文心得包括案例基于《重新定义》,动态扩容Eureka是为了不影响已运行服务的情况下进行扩容。

    胖虎
  • tbox v1.6.5 发布,改进协程调度支持

    这个版本功能和特性改动并不多,主要是改进了下协程的调度模块,实现对process, socket,pipe这三种对象间的统一调度支持,我们可以在协程中同时操作进...

    ruki

扫码关注云+社区

领取腾讯云代金券