在了解单例模式之前让我们先看看单例模式能干嘛
在整个游戏中只有一个而你又想可以方便地随时访问它,这时你就可以考虑单例模式了。例如:
单例模式(Singleton Pattern):类的实例在内存中只存在一份。一种最简单的设计模式之一,属于创建型模式。它提供了一种创建对象的最佳方式。
这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该对象。
在unity中,分为两种单例类,一种是继承monobehavior的单例,一种是普通的单例。
至于这两种单例类的创建详情推荐大家去下面这个网址学习,其中讲到了单例类的继承
下面是我个人认为比较好的方式(继承monobehvior)来创建一个用于音乐管理的单例脚本。
MusicManager.cs脚本
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Audio;
public class MusicManager : MonoBehaviour
{
private static MusicManager current; // 私有静态实例
private void Awake() // 创建实例不能放在Start中,这是由执行顺序决定的
{
if (current != null) // 避免场景重载或者切换时出现多个
{
Destroy(gameObject);
return;
}
current = this; // 创建唯一实例
DontDestroyOnLoad(gameObject); // 若想在场景切换时,单例模式不受任何影响需要加上这句
}
private void OnApplicationQuit()
{
if (current != null)
{
Destroy(gameObject); // 在OnApplicationQuit函数中销毁单例模式
}
}
}
注释内容的详解见
https://blog.csdn.net/ycl295644/article/details/49487361
上述代码如想直接应用在自己的项目需要注意以下几点:
第二种方法:无需继承Monobehavior,但需要另外创建一个脚本来调用该单例类的属性
UIManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class UIManager
{
//-------- 单例模式部分 始
private static UIManager _instance;
public static UIManager Instance // 当UIManager的Instance属性被调用后,自动生成该实例
{
get
{
if (_instance == null)
_instance = new UIManager();
return _instance;
}
}
// 构造函数
private UIManager()
{
Test(); // 放一些单例实例创建后需要运行的代码
}
//------ 单例模式部分 终
public void Test()
{
Debug.Log("test success");
}
}
GameRoot.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameRoot : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
UIManager.Instance.Test();
}
}
Hints:
GameRoot.cs 需要作为一个unity对象的脚本组件存在,才能保证在运行时顺利生成 UIManager 类 来进行UI的管理。
该部分原文链接:https://blog.csdn.net/tableview/article/details/14125943
单例模式提供了对唯一实例的受控访问。因为单例类封装了它的唯一实例,所以它可以严格控制客户怎样以及何时访问它。
由于在系统内存中只存在一个对象,因此可以节约系统资源,对于一些需要频繁创建和销毁的对象单例模式无疑可以提高系统的性能。
允许可变数目的实例。基于单例模式我们可以进行扩展,使用与单例控制相似的方法来获得指定个数的对象实例,既节省系统资源,又解决了单例单例对象共享过多有损性能的问题。
由于单例模式中没有抽象层,因此单例类的扩展有很大的困难。
单例类的职责过重,在一定程度上违背了“单一职责原则”。因为单例类既充当了工厂角色,提供了工厂方法,同时又充当了产品角色,包含一些业务方法,将产品的创建和产品的本身的功能融合到一起。
现在很多面向对象语言(如Java、C#)的运行环境都提供了自动垃圾回收的技术,因此,如果实例化的共享对象长时间不被利用,系统会认为它是垃圾,会自动销毁并回收资源,下次利用时又将重新实例化,这将导致共享的单例对象状态的丢失。
文章浏览阅读1.4k次。本文章取自51CTO视频,仅供学习参考。_easyui draggable handle什么意思
文章浏览阅读545次。1. /etc/fstab就是在开机引导的时候自动挂载到linux的文件系统。 在linux中/etc/fstab的数据项如下所示:/dev/device mountpoint type rules 0 order 例如这是一个普通的/etc/fstab:/dev/hda2 / ext3 defaults 0 1/dev/hda3 swap swap defaults 0_linux /etc/apt 下文件介绍
文章浏览阅读364次。DevExpress VCL Controls是Devexpress公司旗下最老牌的用户界面套包,所包含的控件有:数据录入、图表、数据分析、导航、布局等。该控件能帮助您创建优异的用户体验,提供高影响力的业务解决方案,并利用您现有的VCL技能为未来构建下一代应用程序。DevExpress VCL v20.2.8最新版下载DevExpress技术交流群3:700924826欢迎一起进群讨论具体更新内容如下:此列表包括v20.2.8中已解决的所有问题。ExpressBars Sui..._devexpress vcl 20下载
文章浏览阅读1.3k次,点赞3次,收藏17次。g2o图优化库的使用1、背景知识介绍2、代码详解一、点和边的类型定义二、构建图优化实例,配置求解器三、添加点和边四、执行优化3、ax^2+bx+c实现一、程序:二、运行结果1、背景知识介绍优化的目的是为了通过当前已知的系统理想化的模型和实际测量的数据获取最近接真实值的系统结果。这样的定义让人很容易联想起来各种滤波方法的目的,的确滤波方法和图优化方案解决的问题都是对不可靠的测量值进行处理以获取尽可能接近真实值的结果,例如以卡尔曼滤波器为例,在进行操作之前我们需要有一个相对靠谱的预测模型用来获取先验(预测)_g2o chi2
文章浏览阅读113次。1]岑威钧,王肖鑫,蒋明欢.基于EEMD-LSTM-ARIMA的土石坝渗压预测模型研究[J].水资源与水工程学报,2023,34(02):180-185.[2]沈露露,梁嘉乐,周雯.基于ARIMA-LSTM的能量预测算法[J].无线电通信技术,2023,49(01):150-156.(3)采用确定好阶数的ARIMA(p , d ,q)拟合时间序列,并根据预测后的数据和原时间序列进行结果统计和预测精度分析。# ===========主程序================dim = 5 # 鲸鱼的维度。
文章浏览阅读609次。都会需要有用到BaseActivity,从最开始的initData、initView,到后来需要承载监听推送、监听网络变化的广播、延迟锁定等等各种需求,BaseActivity的功能越来越杂,越来越密集。相对实际的页面上的功能需求,基类的封装经过这样长时间的无脑堆砌,到最后看起来会更匪夷所思。所以从一开始,Base的封装就要足够清晰、稳健、可扩展。AndroidBase我的思路是分层继承,每一层只..._android initviewcomponent initdatacomponent
文章浏览阅读1.1k次。数组 à 集合 à 泛型集合 写法说明数组Int[] arrInt;固定大小,固定元素类型集合arrayListhashtable SortedList可变长度Object类型泛型集合ListDiction_array arraylist hashtable
文章浏览阅读2.1k次。postgis进行jdbc连接时,应在classpath和项目对应的WEB-INF/lib下同时引入jar包,否则就会找不到具体连接代码为:Connection c = null; Statement stmt = null; try { Class.forName("org.postgresql.Driver");_postgis-jdbc jar包
文章浏览阅读2.8k次,点赞2次,收藏3次。元素上ref和 Vue2 一样: <div class="classfy_cell flex j-a a-c" ref="classfy">获取dom<script setup lang="ts"> import { getCurrentInstance, onMounted } from "vue"; // 引入全局 let refs = null; onMounted(() => { let { $refs } =_vite 获取元素
文章浏览阅读452次。【实例简介】里面有通信matlab仿真,通信天线的源代码仿真,建立模型,代码正确可以运行成功【实例截图】【核心代码】09c3ba17-29e4-4534-a762-76c189a8aa04└── 通信天线建模与MATLAB仿真分析 源代码├── chapter02│ ├── impmet.m│ ├── matlabcompiler│ │ ├── impmet.m│ │ └..._通信天线建模与matlab仿真分析
文章浏览阅读1.1k次,点赞21次,收藏17次。本原创程序提出的ZOA-PCNN-AT-SVM故障识别模型还没有人写!在此基础上进一步对参考模型进行多重改进,程序注释清晰,干货满满,下面对文章和程序做简要介绍!_基于格拉姆角场与并行cnn的并网逆变器开关管健康诊断
文章浏览阅读987次。本文转载自:http://blog.csdn.net/clx44551/article/details/78215730?locationNum=8&fps=1RK3288 6.0 双屏异显,横屏+竖屏由于是横屏+竖屏的组合,目前考虑两种实现方案。1.副屏存在黑边 2.对副屏内容进行拉伸。默认情况下,我们设置的双屏初始rotation都为Surface.ROTA...