2. 继承Mono的单例模式基类

前提

  1. 继承MonoBehaviour的脚本不能new
  2. 继承MonoBehaviour的脚本一定得依附在GameObject上

实现挂载式的单例模式基类

挂载式 继承Mono的单例模式基类


/// <summary>
/// 挂载式 继承Mono的单例模式基类
/// </summary>
/// <typeparam name="T"></typeparam>
public class SingletonMono<T>: MonoBehaviour where T:MonoBehaviour
{private static T instance;public static T Instance{get{return instance;}}// 子类可能要重写Awake函数,所以设置为虚函数protected virtual void Awake(){instance = this as T;}
}

TestMgr2继承单例模式的基类,然后把脚本挂在到游戏对象上去,才能在Awake赋值


public class TestMgr2 : SingletonMono<TestMgr2>
{private int i;protected override void Awake(){// 重写Awake时候,这里不能省略base.Awake();i = 0;}public void TestLog(){print("TestMgr2" + i);}}

测试

public class Main : MonoBehaviour
{private void Start(){TestMgr2.Instance.TestLog();}}

缺点

因为很容易被破坏单例模式的唯一性
1.挂载多个脚本
2.切换场景回来时,由于场景放置了挂载脚本的对象,回到该场景时 又会有一个该单例模式对象
3.还可以通过代码动态的添加多个该脚本 也会破坏唯一性

修改Awake


/// <summary>
/// 挂载式 继承Mono的单例模式基类
/// </summary>
/// <typeparam name="T"></typeparam>
public class SingletonMono<T>: MonoBehaviour where T:MonoBehaviour
{private static T instance;public static T Instance{get{return instance;}}// 子类可能要重写Awake函数,所以设置为虚函数protected virtual void Awake(){//已经存在一个对应的单例模式对象了 不需要在有一个了if(instance != null){Destroy(this);return;}instance = this as T;//我们挂载继承该单例模式基类的脚本后 依附的对象过场景时就不会被移除了//就可以保证在游戏的整个生命周期中都存在 DontDestroyOnLoad(this.gameObject);}
}

实现自动挂载式的单例模式基类

创建单例模式基类SingletonAutoMono,实现动态挂载脚本


/// <summary>
/// 自动挂载式的 继承Mono的单例模式基类
/// 推荐使用 
/// 无需手动挂载 无需动态添加 无需关心切场景带来的问题
/// </summary>
/// <typeparam name="T"></typeparam>
public class SingletonAutoMono<T> : MonoBehaviour where T:MonoBehaviour
{private static T instance;public static T Instance{get{if(instance == null){//动态创建 动态挂载//在场景上创建空物体GameObject obj = new GameObject();//得到T脚本的类名 为对象改名 这样再编辑器中可以明确的看到该//单例模式脚本对象依附的GameObjectobj.name = typeof(T).ToString();//动态挂载对应的 单例模式脚本instance = obj.AddComponent<T>();//过场景时不移除对象 保证它在整个游戏生命周期中都存在DontDestroyOnLoad(obj);}return instance;}}}

Test2Mgr2继承单例模式基类

public class Test2Mgr2 : SingletonAutoMono<Test2Mgr2>
{public void TestLog(){print("Test2Mgr2");}
}

测试

public class Main : MonoBehaviour
{private void Start(){Test2Mgr2.Instance.TestLog();}}

潜在的安全问题

  1. 构造函数问题:
    继承MonoBehaviour的函数,不能new,所以不用担心公共构造函数
  2. 多线程问题:
    Unity主线程中相关内容,不允许其他线程直接调用,很少有这样的需求,所以也不用太担心
  3. 重复挂载问题:
    1. 手动重复挂载
    2. 代码重复添加

需要人为干涉,定规则,或者通过代码逻辑强制处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/445003.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Backend - MySQL Server、HeidiSQL

目录 一、MySQL Server &#xff08;一&#xff09;官网下载 &#xff08;二&#xff09;安装与配置 二、HeidiSQL软件 &#xff08;一&#xff09;安装 1. 官网下载 2. 打开 3. 使用 &#xff08;1&#xff09;打开服务 &#xff08;2&#xff09;新增数据库 ​&#xff…

python networkx 计算路径A*

import matplotlib.pyplot as plt # 导入 Matplotlib 工具包 import networkx as nx # 导入 NetworkX 工具包 from typing import List# 初始化空的无向图 graph nx.Graph() # 向图中添加多条赋权边: (node1,node2,weight) graph.add_weighted_edges_from([(1, 2, 50),(1, 3…

集合框架05:List接口使用、List实现类、ArrayList使用

视频链接&#xff1a;13.11 ArrayList使用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1zD4y1Q7Fw?p11&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.List接口使用代码举例 package com.yundait.Demo01;import java.util.ArrayList; import java.util.List;pu…

dowhy中反驳实验怎么做?

首先&#xff0c;我们打开最新的dowhy版本网站。 https://www.pywhy.org/dowhy/v0.11.1/index.html 我们主要看标题栏的User Guide和Examples就可以了&#xff0c;如果在User Guide 里找不到使用方法&#xff0c;就去Examples里找例子&#xff0c;里面的数据读取修改为自己的数…

Copilot Coaching新功能铸就Word更强

Copilot 的意思是副驾驶。 现在&#xff0c;您的副驾驶教练来了&#xff1a;Copilot Coaching Copilot Coaching 是 Word 中的一项新 Copilot 功能&#xff0c;可在您查看内容时为您提供支持&#xff0c;以实现语法和拼写之外的改进 - 帮助您澄清想法&#xff0c;并为您提供有…

前端反馈弹框组件封装

一、需求背景 需要针对某个功能进行用户调查反馈&#xff0c;设计一个弹框&#xff0c;进行后端入表记录&#xff0c;以便后期进行数据分析。 二、实现UI 三、代码留存 以vue为例 <template><div class"advice-container"><van-dialogv-model"…

【父子线程传值TransmittableThreadLocal使用踩坑-及相关知识拓展】

文章目录 一.业务背景二.TransmittableThreadLocal是什么&#xff1f;三.问题复现1.定义注解DigitalAngel2.定义切面3.TransmittableThreadLocal相关4.线程池配置信息5.Controller6.Service7.测试结果8.问题分析9 解决办法及代码改造10.最终测试&#xff1a; 四.与 ThreadLocal…

02复写零

复写零 我们先进行异地复写&#xff1a;代码如下 public class Test {public static void main(String[] args) {int []array {1,0,2,3,0,4};duplicateZeros(array);}public static void duplicateZeros(int[] arr) {int [] elemnew int[arr.length];for(int cur0,dest0;des…

QD1-P17 HTML 下拉框标签(select、option)

本节学习 HTML 常用标签&#xff1a;select和option ‍ 本节视频 www.bilibili.com/video/BV1n64y1U7oj?p17 ‍ 知识点1&#xff1a;select标签用法 演示 ​​ HTML <select name"city"><option>北京</option><option>上海</opti…

新版Win32高级编程教程-学习笔记01:应用程序分类

互联网行业 算法研发工程师 目录 新版Win32高级编程教程-学习笔记01&#xff1a;应用程序分类 控制台程序 强烈注意 窗口程序 启动项 程序入口函数 库程序 静态库 动态库程序 几种应用程序的区别 控制台程序 本身没有窗口&#xff0c;其中的doc窗口&#xff0c;是管…

【通信协议讲解】单片机基础重点通信协议解析与总结(IIC,CAN,MODBUS...)

目录 一.IIC总线 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 二.SPI总线 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 三.串口通信 基础特性&#xff1a; 配置特性&#xff1a; 时序特性&#xff1a; 四.CAN总线 基础特性…

三款GIS工具多角度对比:免费的倾斜摄影OSGB/3Dtiles编辑转换发布平台

GIS数据处理工具在现代技术与应用中扮演着至关重要的角色&#xff0c;它们不仅是连接原始地理信息与可分析、可视化数据的桥梁&#xff0c;更是推动地理信息系统&#xff08;GIS&#xff09;在各个行业领域深入发展与应用不可或缺的关键工具。选择一款合适的工具直接关系到数据…

HttpURLConnection学习

介绍 HttpURLConnection类是位于java.net包下继承了URLConnection类的一个抽象类&#xff0c;每个 HttpURLConnection 实例都用于发出单个请求。 URL HttpURLConnection的使用需要依赖URL类&#xff0c;URL类位于java.net包下&#xff0c;有很多种构造方法。 HttpURLConnect…

AI引起用人格局变动,个人如何应对这一趋势

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 人工智能的发展带来的就业结构变革&#xf…

论文笔记:D-vlog 用于抑郁症检测的多模态数据集

整理了AAAI2022 D-vlog: Multimodal Vlog Dataset for Depression Detection 论文的阅读笔记 背景方法特征提取模型 实验数据集主实验不同模态的性能性别的影响 背景 以往关于抑郁症检测的工作大多集中在实验室环境下对抑郁症个体的检测&#xff0c;难以在实践中推广。本文提出…

图解C#高级教程(五):枚举器和迭代器

本章主要介绍 C# 当中枚举器、可枚举类型以及迭代器相关的知识。 文章目录 1. 枚举器和可枚举类型2. IEnumerator 和 IEnumerable 接口2.1 IEnumerator 接口2.2 IEnumerable 接口 3. 泛型枚举接口4. 迭代器4.1 使用迭代器创建枚举器4.2 使用迭代器创建可枚举类4.3 迭代器作为属…

消峰限流有哪几种方式?

消峰限流的方式 业务视角 验证码回答问题环节 技术视角 消息队列异步化用户请求 限流&#xff0c;对流量进行层层过滤 nginx 层限流&#xff0c; 一是控制速率 limit_req 漏桶算法 limit_req_zone $binary_remote_addr zonemylimit:10m rate2r/s; server { location / { lim…

leetcode链表(三)-反转链表

题目 . - 力扣&#xff08;LeetCode&#xff09; 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 思路 首先定义一个cur指针&#xff0c;指向头结点&#xff0c;再定义一个pre指针&#xff0c;初始化为None。 然后就要开始反转了&…

其他浏览器可以联网,但edge不能联网

问题描述&#xff1a; 今早edge无法上网&#xff0c;检测网络连接正常&#xff0c;而且其他chrome&#xff0c;Firefox和360浏览器都可以上网。 解决方案&#xff1a; 注意&#xff1a;为防止是代理问题&#xff0c;可以在扩展中禁用后再试试 如果没有代理或者禁用代理也不…

基于SpringBoot摄影师分享交流社区【附源码】

基于SpringBoot摄影师分享交流社区 效果如下&#xff1a; 系统首页界面 用户注册界面 作品信息页面 公告资讯页面 管理员登录页面 管理员功能界面 作品类别界面 作品信息界面 研究背景 随着互联网技术的快速发展&#xff0c;数字摄影技术的普及使得越来越多的摄影爱好者渴望…