当前位置: 首页 > news >正文

Unity 单例模式

Unity中单例模式是非常常用的写法,可以基于C#语言的几种不同方法来实现。
下面我将列出几种常见的实现方式:

1. 经典的单例模式

public class SingletonExample : MonoBehaviour
{private static SingletonExample instance;public static SingletonExample Instance{get{if (instance == null){instance = FindObjectOfType<SingletonExample>();if (instance == null){GameObject obj = new GameObject("SingletonExample");instance = obj.AddComponent<SingletonExample>();DontDestroyOnLoad(obj);}}return instance;}}private void Awake(){if (instance == null){instance = this;DontDestroyOnLoad(this.gameObject);}else if (instance != this){Destroy(gameObject);}}
}

优点:

  • 易于理解和实现。
  • 可以在Unity的场景中直接使用,提供了与Unity生命周期事件的结合。

缺点:

  • 不是完全的线程安全。在多线程环境下,可能会创建多个实例。
    如果没有在场景中找到实例,它会创建一个新的GameObject,这可能会导致意外的副作用。

2. 使用静态构造函数

public class SingletonExample
{private static readonly SingletonExample instance = new SingletonExample();static SingletonExample(){}private SingletonExample(){}public static SingletonExample Instance{get{return instance;}}
}

优点:

  • 实现简单,线程安全由CLR (公共语言运行时)保证。
  • 静态构造函数只会被执行一次,保证了实例的唯一性。

缺点:

  • 实例在程序运行时立即创建,无论是否使用,可能会导致资源的浪费。
    不适合在Unity场景对象中使用,因为它与MonoBehaviour断开了联系,不能直接应用到GameObject上。

3. 使用Lazy类型确保线程安全

using System;public class SingletonExample
{private static readonly Lazy<SingletonExample> lazy =new Lazy<SingletonExample>(() => new SingletonExample());public static SingletonExample Instance { get { return lazy.Value; } }private SingletonExample(){}
}

优点:

  • 实现简单,线程安全由CLR (公共语言运行时)保证。
  • 静态构造函数只会被执行一次,保证了实例的唯一性。

缺点:

  • 实例在程序运行时立即创建,无论是否使用,可能会导致资源的浪费。
    不适合在Unity场景对象中使用,因为它与MonoBehaviour断开了联系,不能直接应用到GameObject上。

4. 双重校验锁(Double-Check Locking)

public class SingletonExample
{private static SingletonExample instance;private static readonly object lockObject = new object();public static SingletonExample Instance{get{if (instance == null){lock (lockObject){if (instance == null){instance = new SingletonExample();}}}return instance;}}private SingletonExample(){}
}

优点:

  • 线程安全,并且在需要时才创建实例。
  • 相对于Lazy,在早期的.NET版本中也可以使用。

缺点:

  • 实现复杂,需要正确管理锁,否则可能会导致死锁。
  • 性能开销,每次访问实例时都需要进行双重检查。
  • 不直接与MonoBehaviour兼容,同样不适合直接应用于Unity场景中的对象。

总结:

在选择实现单例的方法时,应当考虑是否需要延迟初始化、是否在多线程环境中使用、以及是否需要与Unity的MonoBehaviour系统集成等因素。
在Unity中,经常使用第一种方法,因为它能够更好地与Unity的组件和生命周期集成。
不过,如果你在Unity项目中需要使用单例模式管理非MonoBehaviour类型的资源或类,例如数据管理或服务类,那么**第三种方法(Lazy)**是一个非常好的选择。

相关文章:

Unity 单例模式

Unity中单例模式是非常常用的写法&#xff0c;可以基于C#语言的几种不同方法来实现。 下面我将列出几种常见的实现方式&#xff1a; 1. 经典的单例模式 public class SingletonExample : MonoBehaviour {private static SingletonExample instance;public static SingletonEx…...

Oracle-一次TX行锁堵塞事件

问题背景&#xff1a; 接用户问题报障&#xff0c;应用服务出现大量会话堆积现象&#xff0c;数据库锁堵塞严重&#xff0c;需要协助进行问题定位和排除。 问题分析&#xff1a; 登录到数据库服务器上&#xff0c;首先查看一下数据库当前的等待事件情况&#xff0c;通过gv$ses…...

Gtid方式搭建主从复制+MHA高可用集群

GTID是什么 GTID(全局事务标识符),它用于唯一标识一个事务。每个GTID由三个部分组成: 服务器唯一标识符事务序列号全局事务标识符使用gtid可以简化主从复制的配置和管理,减少由于复制链路终端、主从数据不一致等问题带来的风险如何开启GTID: 在/etc/my.cnf文件中添加如下…...

基于matlab GUI的Alpha shapes边缘提取

1、程序介绍 本程序是基于matlab语言&#xff0c;使用alpha shapes算法实现点云边缘提取。算法具体原理参考博客&#xff1a;基于alpha shapes的边缘点提取&#xff08;matlab&#xff09;-CSDN博客。该程序包括3个按钮&#xff1a;加载点云、边缘点提取、保存。其中&#xff0…...

[Android]常见的包管理方式

在Android开发中&#xff0c;包管理主要是通过构建和依赖管理工具来处理。下面列举了几种最常见和主流的包管理方式&#xff1a; 一、Gradle Gradle 是 Android 官方推荐的构建工具&#xff0c;几乎成为了 Android 开发的标准。它支持自定义构建逻辑、依赖管理、多项目构建等…...

每日10亿数据的日志分析系统OOM

背景 一个每日10亿数据的日志清洗系统&#xff0c;主要工作就是从消息队列中消费各种各样的日志&#xff0c;然后对日志进行清洗&#xff0c;例如&#xff1a;用户敏感信息(姓名、手机号、身份证)进行脱敏处理,然后把清理完的数据交付给其他系统使用。 我们项目中&#xff0c;…...

智能驱动,精准管理:打造高效干部管理系统

干部管理系统是现代组织管理中不可或缺的工具&#xff0c;它通过信息技术的应用&#xff0c;提高了干部管理的效率和准确性。干部管理系统的主要功能包括&#xff1a; 1. 信息管理&#xff1a;系统可以存储和管理干部的个人信息&#xff0c;包括基本资料、工作经历、教育背景、…...

轮式机器人简介

迄今为止,轮子一般是移动机器人学和人造交通车辆中最流行的运动机构。它可达到很高的效率, 如图所示, 而且用比较简单的机械就可实现它的制作。 另外,在轮式机器人设计中,平衡通常不是一个研究问题。 因为在所有时间里,轮式机器人一般都被设计成在任何时间里所有轮子均与地接…...

已知哈夫曼节点个数,求哈夫曼字符编码数

哈夫曼编码(Huffman Coding)是一种用于无损数据压缩的嫡编码(权编码)算法。 在哈夫曼树中&#xff0c;每个叶子节点都代表一个字符&#xff0c;而节点的权重通常代表字符的频率。在哈夫曼编码中&#xff0c;每个字符都会被赋予一个二进制编码。为了获得这些编码&#xff0c;我…...

Kubernetes Cluster IP,Node IP,Pod IP间通信原理解析

目录 1、Cluster IP2、Node IP3、NodePort4、Pod IP5、LoadBalancer6、三种IP间通信6.1、Pod IP 与 Pod IP 通信6.2、Pod IP 与 Cluster IP 通信6.3、Node IP 与 Pod IP 通信6.4、Node IP 与 Cluster IP 7、YAML 示例7.1、ClusterIP Service7.2、LoadBalancer Service 1、Clust…...

随机链表的深拷贝

1.题目 解题思路一&#xff1a;暴力求解&#xff0c;先创建新链表&#xff0c;然后把旧链表中的val和next指针给复制到新链表中&#xff0c;根据旧链表中的random指针所指向的旧链表中的val值找到所对应的节点&#xff0c;记录该节点的位置&#xff0c;就像数组一样&#xff0c…...

328_C++_HTTP_HTTP协议传输data数据,为什么要进行base64编解码操作?

http传输data数据的时候&#xff0c;为什么必须进行base64转码后才能有效发送&#xff0c;接收方也必须base64转码后才能有效接受&#xff1f; HTTP  HTTP传输数据时&#xff0c;使用Base64编码并不是必须的&#xff0c;但它确实在某些情况下非常有用。以下是为什么在某些情况…...

【二叉树】Leetcode N 叉树的层序遍历

题目讲解 429. N 叉树的层序遍历 算法讲解 在做层序遍历的时候由于它的每一个结点是有val vector child组成&#xff0c;所以在做层序遍历的时候需要考虑它每一层结点的个数&#xff0c;那我们就可以使用一个queue保存每一层的结点&#xff1b;那么我们在做第一层的时候&am…...

Spring AI

目录 一、Spring AI 1、Spring AI简介 1.1、四次工业革命发展和变革 1.2、什么是人工智能? 1.3、人工智能的发展历程 1.4、什么是大模型? 1.5、如何训练大模型? 一、Spring AI 1、Spring AI简介 Spring AI Java接入人工智能大模型 1.1、四次工业革命发展和变革 人类…...

fiori SAP ui5 动态改变控件颜色

使用CustomData动态改变控件颜色 有时候我们需要改变控件颜色&#xff0c;对于高度封装的控件&#xff0c;显然改变控件CSS是比较困难的&#xff0c;幸好SAP UI5预设了一个customData的属性&#xff0c;每个控件都能使用她。 如下代码是判断汇率是否有改变&#xff0c;如果改…...

RabbitMQ php amqp

Linux debian 安装 Windows php amqp 扩展 PECL :: Package :: amqp 将 php_amqp.dll 复制到 php 的 ext 目录下 将 rabbitmq.4.dll 复制到 c:\windows\system32 目录下 php.ini extensionamqp...

对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;falses 思路&#xff1a;我刚开始是想着用…...

浅浅总结SQL中的事务.

在现实生活中有很多的线上支付的场景,当支付的时候&#xff0c;一方资金减少&#xff0c;另一方资金增加&#xff0c;在执行前后&#xff0c;两者的总体数额需要相同&#xff0c;为了保证这个操作的完整&#xff0c;所以提出了事务&#xff0c;那我们先来去写一个示例&#xff…...

C++ | Leetcode C++题解之第76题最小覆盖子串

题目&#xff1a; 题解&#xff1a; class Solution { public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const au…...

什么可以替代iframe?

网页嵌套中&#xff0c;iframe曾几何时不可一世&#xff0c;没有其他更好的选择&#xff01; iframe即内联框架&#xff0c;作为网页设计中的一种技术&#xff0c;允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利&#xff0c;但也存在多方面的缺陷…...

SLEICL框架:用“魔法书”提示工程提升小模型上下文学习性能

1. 项目概述&#xff1a;用“魔法书”解锁小模型的大潜能 如果你最近在折腾大语言模型&#xff0c;尤其是那些参数规模在7B、13B左右的“小模型”&#xff0c;可能会发现一个头疼的问题&#xff1a;想让它们通过上下文学习&#xff08;In-context Learning, ICL&#xff09;的方…...

从ONOS 1.10.0升级到1.15.0,我踩了这些坑:日志命令、GUI激活与依赖项变化全记录

从ONOS 1.10.0升级到1.15.0的实战避坑指南 当你从ONOS 1.10.0升级到1.15.0时&#xff0c;可能会遇到一系列意料之外的"惊喜"。作为一个刚从这场升级大战中幸存下来的老兵&#xff0c;我想分享一些血泪教训和实用技巧&#xff0c;帮助后来者少走弯路。 1. 升级前的准备…...

基于区块链与IPFS的视频版权存证系统之区块链部分设计

本节对视频版权存证系统的区块链部分做一个简单的介绍,包括目录结构、文件作用、设计思路。 购买专栏前请认真阅读:《基于区块链与IPFS的视频版权存证系统》专栏简介 一、区块链部分文件目录简介 ├── bin //保存了二进制文件方便启动网络 │ ├── configtxgen //生成…...

为什么92%的实时数仓项目在2025Q4突然转向AI原生平台?——奇点大会12家头部企业联合验证数据披露

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生实时计算平台&#xff1a;2026奇点智能技术大会流批一体实践 在2026奇点智能技术大会上&#xff0c;新一代AI原生实时计算平台正式发布&#xff0c;其核心突破在于将大模型推理调度、向量流式计算…...

如何用Rye与Docker打造无缝Python容器开发环境:完整实践指南

如何用Rye与Docker打造无缝Python容器开发环境&#xff1a;完整实践指南 【免费下载链接】rye a Hassle-Free Python Experience 项目地址: https://gitcode.com/gh_mirrors/ry/rye Rye是一款旨在提供无忧Python开发体验&#xff08;a Hassle-Free Python Experience&am…...

SAR ADC性能优化:电压基准设计与THD改善方案

1. 电压基准对SAR ADC性能的影响机制在精密数据采集系统设计中&#xff0c;工程师们常常花费大量精力选择高性能的模数转换器(ADC)和优化输入驱动电路&#xff0c;却容易忽视一个关键因素——电压基准的质量及其驱动能力。对于逐次逼近型(SAR)ADC而言&#xff0c;基准电压的稳定…...

大型机场U型机坪推出等待点运行优化【附案例】

✨ 长期致力于机场、U型机坪区、推出等待点、运行程序优化、启发式算法研究工作&#xff0c;擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅如需沟通交流&#xff0c;点击《获取方式》 &#xff08;1&#xff09;单通道U型机坪推出等待点位优化…...

Windows Cleaner:彻底告别C盘爆红的免费开源解决方案

Windows Cleaner&#xff1a;彻底告别C盘爆红的免费开源解决方案 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 面对Windows系统使用过程中C盘空间不断告急的困扰…...

从‘能用’到‘优雅’:Python函数设计的3个坏味道与5个重构技巧(附代码对比)

从‘能用’到‘优雅’&#xff1a;Python函数设计的3个坏味道与5个重构技巧&#xff08;附代码对比&#xff09; 在Python开发中&#xff0c;函数是最基本的代码组织单元。许多开发者能够快速实现功能&#xff0c;却往往忽视了函数设计的质量。本文将揭示三种典型的函数设计&qu…...

别再花钱买服务器了!手把手教你用Sakura Frp免费搞定内网穿透(Windows保姆级教程)

零成本实现内网穿透&#xff1a;Windows平台实战指南 在个人开发和小型项目测试阶段&#xff0c;许多开发者都面临一个共同难题——如何将本地服务暴露到公网供临时访问&#xff1f;传统解决方案往往需要租用云服务器&#xff0c;不仅成本高昂&#xff0c;配置过程也相当复杂。…...