首页 > 其他分享 >Unity-单例模式

Unity-单例模式

时间:2023-11-14 19:25:10浏览次数:34  
标签:创建 模式 instance Unity 单例 泛型 public

Unity-单例模式

前言

​ 对于某些特殊的类,我们希望 在整个程序的生命周期只创建一个该类的对象 ,或是希望 在其他类没有持有该类的引用,就可以调用该类中的函数,我们就需要将这个类写成 单例模式

单例的简单实现

public class Test()
{
	pubic abstract Test Instance;//创建程序中该类的唯一一个对象
    
    private void Awake()//在程序启动时,直接创建一个该类的对象
    {
        if(Instance!=null)//如果已经创建了一个变量,便将该变量删除
        {
            Destroy(gameObject);
        }

        Instance = this;
    }
}

泛型单例

为什么需要泛型单例

​ 在通常的游戏制作中,我们会创建许多的 Manager 来管理我们的游戏,如果每创建一个 Manager 都要重新写一遍单例会非常麻烦,因此就需要 泛型单例

代码实现

泛型单例,顾名思义就是事先不知道单例的类型,其类型取决于继承该泛型父类的子类

​ 代码如下:

public class Singleton<T> : MonoBehaviour where T :Singleton<T> //where确定继承该父类的是什么类型的子类
{
    private static T instance;

    //用于获取单例的属性
    public static T Instance
    {
        get { return instance;}
    }

    //程序启动时调用,给单例唯一变量赋值
    protected virtual void Awake()
    {
        if(instance != null)
        {
            Destroy(gameObject);
        }
        else
        {
            instance = (T)this;
        }
    }

    //判断单例是否已经被创建的属性
    public static bool IsInitialized
    {
        get { return instance != null;}
    }
    
    //销毁函数
    protected void OnDestroy() 
    {
        if(instance == this)
        {
            instance = null;
        }    
    }
}

更多可能

​ 如果我们在一个项目中 过度使用单例模式,就会造成该项目的 耦合性非常高,一个单例中的某个变量,可能同时被十几个对象引用,导致牵一发而动全身,使得项目 难以维护。我们急需一种方法,能够提供单例模式的功能,但又没有单例模式如此之高的耦合度。

​ 分析单例模式的功能:它能够让我们在任何地方读取某个对象的信息,但前提是我们必须持有这个对象的引用。那么有没有什么方法可以不持有该对象的引用,但仍然可以读取该对象的信息呢?

​ 这时候我们就可以使用设计模式中的 观察者模式

参考资料

观察者模式 - AshScops - 博客园 (cnblogs.com)

观察者设计模式 (refactoringguru.cn)

标签:创建,模式,instance,Unity,单例,泛型,public
From: https://www.cnblogs.com/MMMMrD/p/17832323.html

相关文章

  • Unity-射线
    Unity-射线前言​ 在游戏开发的过程中,许多功能的实现都需要物理检测,而发射射线是Unity中物理检测的通用方法。例如,我们需要检测玩家(Player)脚下是否是地面(图层为Ground),只需要从脚底发射一条射线,检测Player脚下GameObject的图层是否为Ground即可。​ 射线和物理检测何其重要,......
  • Unity-对象池 & 多对象池
    Unity-对象池&多对象池简介​ 在制作游戏的过程中,人物和boss的设计往往会有释放多个子弹的攻击方式。我们可以用直接创造子弹然后销毁的办法来实现这些技能的效果,但当子弹开始变多,游戏就会不断的消耗我们的内存。为了解决这个问题,开发者们就引入了状态机。普通对象池创建思......
  • Unity-协程
    Unity-协程协程的简单实现​ 一般的程序执行都是线性的,也就是必须一行一行的执行代码。​ 使用Unity提供的协程,就可以类似于开辟另一条线程,调整根据你所写的代码,调整下一行代码执行的时间。项目示例​ 下面的例子是一个U3DDemo中的代码,实现最简单的Enemy追击Player的......
  • Unity3D 如何用unity引擎然后用c#语言搭建自己的服务器
    Unity3D是一款强大的游戏开发引擎,可以用于创建各种类型的游戏。在游戏开发过程中,经常需要与服务器进行通信来实现一些功能,比如保存和加载游戏数据、实现多人游戏等。本文将介绍如何使用Unity引擎和C#语言搭建自己的服务器,并给出技术详解以及代码实现。对惹,这里有一个游戏开发交流......
  • pgsql 查询对应模式下的表结构语句
    selecttable_name,column_name,data_type,udt_name,table_catalog,table_schema,table_name,column_name,ordinal_position,column_defaultfrominformation_schema.columnswheretable_schema='{schema}'andtab......
  • 活动报名 | 数字外贸私享会: 新商机、新模式、新政策,助企业实现弯道超车
    你是否觉得:投入了很多,拓客难度却越来越大?大单来了不敢接?风险不可控物流运输成本高,订单利润越来越低?客户账期长,回款难回款慢,企业资金压力大?“双碳”国策下,不知如何应对?数字时代下,外贸企业仅靠邮件、线下、传统等模式难以突破困局,业务增长缓慢,只有主动出击,借助数字运营模式不断完善获......
  • 学习随笔(设计模式:装饰模式)
    内容今天学习了新的设计模式,装饰模式。装饰模式:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更加灵活。收获1.当我们在设计软件时,考虑使用基类和派生类的时候,就可以考虑是否可以使用装饰模式,因为装饰模式比生成子类更加灵活2.当我们对一个已有的类添......
  • ChatGPT、GPT-4 Turbo接口调用(stream模式)
    接口地址https://chat.xutongbao.top/api/light/chat/createChatCompletion请求方式post请求参数model可选值:“gpt-3.5-turbo-1106”、“gpt-3.5-turbo-16k”、“gpt-4”、“gpt-4-1106-preview”。默认值为:“gpt-3.5-turbo-1106”token获取方式:访问:https://chat.xutongbao.to......
  • 软件设计Tutorial 6_原型模式
    [实验任务一]:向量的原型用C++完成数学中向量的封装,其中,用指针和动态申请支持向量长度的改变,使用浅克隆和深克隆复制向量类,比较这两种克隆方式的异同。实验要求:1. 画出对应的类图;  2. 提交源代码(用C++完成); #include<iostream>#include<cstring>classVec......
  • 软件设计实验12:外观模式
    [实验任务一]:计算机开启在计算机主机(Mainframe)中,只需要按下主机的开机按钮(on()),即可调用其他硬件设备和软件的启动方法,如内存(Memory)的自检(check())、CPU的运行(run())、硬盘(HardDisk)的读取(read())、操作系统(OS)的载入(load()),如果某一过程发生错误则计算机启动失败。......