1.non-MonoBehaviour 单例模式泛型基类

Unity 单例基类(运用单例模式) 文章目录单例模式介绍实现思路饿汉模式懒汉模式经典版多线程加锁版加锁改进版单例基类普通单例基类继承自 MonoBehaviour 的单例基类(手动添加到游戏对象上)继承自 MonoBehaviour 的单例基类(自动添加到游戏对象上) 单例模式介绍 单例模式是程序开发中很常用的一种设计模式。有时候为了节省内存资源、保证数据内容的一致性,对某些类要求只能创建一个实例,这就是单例模式。在 unity 中,一些充当管理者的脚本就很适合使用单例模式,比如 UI 管理、事件管理,他们一般都是唯一存在的。 实现思路 通常 阅读详情

一、单例模式

1. 什么是单例模式

单例模式(Singleton Pattern)是一种设计模式。
作用:保证一个类在程序运行期间只有一个实例,并提供统一访问入口。
例如游戏中的管理类:

  • GameManager(游戏管理)
  • AudioManager(音频管理)
  • UIManager(UI管理)
  • DataManager(数据管理)
  • ResourceManager(资源管理)
    这些对象通常整个游戏只需要一个。

2. 为什么需要单例模式

如果普通创建对象:

GameManager gm1 = new GameManager();
GameManager gm2 = new GameManager();

会产生多个管理对象。可能导致:

  • 数据不统一
  • 多个对象重复执行逻辑
  • 增加内存开销

二、非 MonoBehaviour 单例模式

1. 为什么 Manager 不继承 MonoBehaviour

Unity 中继承 MonoBehaviour 的类:

  • 需要挂载到 GameObject
  • 由 Unity 管理生命周期
  • 可以使用 Awake、Start、Update 等函数
    例如:
public class Player : MonoBehaviour
{

}

2. 非 MonoBehaviour 单例特点

优点:

  • 不需要创建 GameObject
  • 不依赖 Unity 生命周期
  • 代码结构更加清晰
  • 适合程序框架层
    缺点:
  • 不能使用 Awake、Start、Update
  • 需要自己管理生命周期

三、泛型单例基类

1. 为什么使用泛型基类

如果每个 Manager 都单独写单例:每个管理器都需要重复编写。

2. 泛型单例基类实现

public abstract class Singleton<T> where T : class, new()
{
    private static T instance;
    public static T Instance
    {
        get
        {
            instance ??= new T();
            return instance;
        }
    }
}

四、泛型约束

1. class 约束

where T : class

表示:T 必须是引用类型。
原因:单例对象需要通过实例引用管理。

2. new() 约束

where T : new()

表示:T 必须拥有无参数构造函数。因为内部需要:new T()创建对象。

五、Instance 属性

1. 作用

Instance 是单例访问入口。
第一次访问:

Instance
 ↓
判断对象是否存在
 ↓
不存在
 ↓
创建对象
 ↓
返回对象

之后访问:

Instance
 ↓
已有对象
 ↓
直接返回

2. 为什么使用属性

推荐:GameManager.Instance;
不推荐:GameManager.GetInstance();
原因:Instance 表示获取对象,更符合 C# 属性设计习惯。

六、具体 Manager 使用方式

1. 创建管理类

public class GameManager : Singleton<GameManager>
{

}

继承:Singleton<GameManager>
即可拥有:GameManager.Instance

2. 添加功能

public class AudioManager : Singleton<AudioManager>
{
    public void PlayMusic()
    {
        Debug.Log("播放音乐");
    }
}

调用:AudioManager.Instance.PlayMusic();

七、非 MonoBehaviour 单例注意事项

1. 不能使用 Unity 生命周期

不能:

Awake()
Start()
Update()

如果需要初始化:
可以提供Initialize()
例如:GameManager.Instance.Initialize();

2. 避免过度使用

单例虽然方便:

XXXManager.Instance

但是大量使用会造成:

  • 类之间耦合增加
  • 后期修改困难
    只用于真正需要全局唯一的对象。
Unity 脚本基类 MonoBehaviour 与 GameObject 的关系 MonoBehaviour 是 Unity 中所有脚本的基类,如果你使用JS的话,脚本会自动继承MonoBehaviour。如果使用C#的话,你需要显式继承MonoBehaviour。 阅读详情

相关推荐

Unity泛型单例模式

Unity泛型单例模式这是单例模式代码:这个不用挂在场景里 其实也挂不进去using UnityEngine; using System.Collections;public class Singleton<T> : MonoBehaviour where T : Component{ private static readonly object syslock=new object();

ChuckGoal的博客 4291

Unity 设计模式 之 单例模式(普通型(new)泛型单例 \ 继承 MonoBehaviour 的泛型单例)

Unity 设计模式 之 单例模式(普通型(new)泛型单例 \ 继承 MonoBehaviour 的泛型单例) 目录 Unity 设计模式 之 单例模式(普通型(new)泛型单例 \ 继承 MonoBehaviour 的泛型单例) 一、简单介绍 二、单例模式(Singleton Pattern) 三、注意事项 四、普通型(new)泛型单例模式 五、继承 MonoBehavio...

仙魁XAN 2441

【unity框架开发1】最详细的单例模式的设计和应用,继承和不继承MonoBehaviour的单例模式,及泛型单例基类的编写

在游戏开发中,单例模式应该是我们最常见也是用的最多的设计模式了,但是你真的了解它吗?本文通过实例分析,我们将阐述如何设计和应用单例模式,以提高代码的可维护性和复用性。无论是初学者还是经验丰富的开发者,这篇文章都将为你提供实用的技巧和深入的理解,帮助你在 Unity 项目中更有效地管理资源和对象。如果要让一个类只有唯一的一个对象,则可以使用单例模式来写。使用的时候用“类名.Instance.成员名”的形式来访问这个对象的成员。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 5215

Unity开发通用泛型单例模式

本文介绍了C#中三种不同的单例模式实现:简单单例、线程安全单例以及针对继承MonoBehaviour的单例模式。每种实现方式都详细说明了其代码逻辑,并确保了单例的唯一性和线程安全性。此外,还强调了单例模式在防止多次实例化和共享全局状态时的重要性。

螞蟻的日常 1208

Origin软件XRD全峰拟合保姆级教程:从数据导入到弱峰处理技巧

本文提供了一份Origin软件进行XRD全峰拟合的深度实战指南。文章重点解析了从数据导入预处理、基线锚点视觉化设置,到弱峰拟合的锁定策略与手动干预等核心技巧,旨在帮助用户避开常见错误,获得可靠、精确的拟合结果,从而有效服务于材料结构分析。

rgv2345678的博客 706

燧原科技云燧ESL64-O超节点:国产AI芯片与OEX光互联架构解析

分布式AI训练通过将计算任务拆分到多个节点并行执行来加速模型训练,其核心原理涉及数据并行和模型并行等策略。在技术价值层面,分布式训练能显著提升大规模深度学习任务的效率,但传统GPU集群常因网络通信瓶颈导致性能受限。OEX光互联架构作为解决通信瓶颈的关键创新,采用硅光技术实现高带宽、低延迟的节点内互联,优化了AI训练中的集合操作。这种硬件级优化特别适用于千亿参数大模型训练和科学计算等场景,能有效降低AI集群的总体拥有成本(TCO)。云燧ESL64-O超节点正是基于国产自研AI芯片与OEX架构的集成方案,为大规

weixin_29071809的博客 370

Unity的MonoBehaviour单例设置

Unity的MonoBehaviour单例设置MonoBehaviour的基本单例模式MonoBehaviour单例的泛型基类MonoBehaviour单例脚本的问题解决方案互斥锁Mutex使用Editor.OnEnable()监测想法实现参考链接 MonoBehaviour的基本单例模式 根据Unity的MonoBehaviour脚本创建单例模式,我们一般的创建方式是: using UnityEngine; public class MonoSingleton : MonoBehaviour {

天富儿的博客 2822

手把手教你解决COLMAP编译中的Ceres CUDA支持问题(附详细配置步骤)

本文详细解析了COLMAP编译中Ceres CUDA支持问题的完整解决方案,包括环境准备、Ceres Solver的CUDA编译配置、COLMAP的CUDA集成配置等关键步骤。通过优化CMake参数和解决常见错误,帮助技术人员充分利用GPU加速优势,提升三维重建效率。

vodka的博客 858

单例模式基类

单例模式的两种方法

weixin_47042152的博客 527

正交试验minitab

1.创建正交试验 2.根据自己的实验选择水平数和因子数,并选定一个正交表 3.得到正交表 4.填写实验结果 5.进行正交分析 点击结果,点击分析 6.得到分析结果 7.方差分析 选择响应变量与因子,点击确定 得到方差分析的结果 ...

a999999123的博客 1万+

数据挖掘实战-基于长短期记忆网络(LSTM)的黄金价格预测模型 | 97% 准确度

本实验基于Kaggle上提供的从2013年到2023年的黄金价格数据集,运用长短期记忆网络(LSTM)构建了黄金价格预测模型。该数据集详细记录了每日的黄金价格信息,包括开盘价、收盘价、高点、低点和交易量等,为模型的训练提供了丰富的数据支持。

m0_64336780的博客 1万+

Unity泛型单例模式源码解析

本文解析了Unity中的泛型单例模式实现SingletonMono<T>。该模式通过泛型约束确保单例继承自MonoBehaviour,使用静态变量存储实例并提供懒加载机制,自动创建或查找场景中的实例。核心特性包括场景持久化(DontDestroyOnLoad)、泛型复用和自动初始化。优点是使用方便、代码复用性高,但需注意线程安全和代码耦合问题。文中提供了使用示例并分析了优缺点,是Unity开发中管理全局对象的实用解决方案。

u010667863的博客 477

黑猫带你学eMMC协议第14篇:eMMC FFU详解(Field Firmware Update)

1 前言 1.1 声明 本文依据eMMC JEDEC5.1及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 内容提要 1、ffu相关寄存器有哪些? 2、如何设置ffu? 3、什么是ffu?是否能够更新旧版本的固件到emmc? 4、ffu配置流程图。 2 什么是FFU 主机下载新的固件到eMMC,下载成功后eMMC将固件安装到设备。 3 相关寄存器/命令 SUPPORTED_MODES [493] FFU_FEATURES [492] 该

黑猫奥利奥的博客 4657

Unity中用泛型实现单例

通过本文介绍的方法,你可以根据自己的需求选择合适的泛型单例实现,并在游戏开发中灵活运用。在适当的场景下使用单例,可以使你的代码更加清晰、高效,但过度使用则可能导致代码难以测试和维护。本文将介绍如何在Unity中使用泛型来实现单例模式,这种方法不仅简洁高效,而且可以减少重复代码,提高代码的可维护性。这种实现方式的问题是,对于每个需要单例的类,我们都需要编写类似的代码,这导致了大量的重复工作。通过泛型,我们可以创建一个可复用的单例基类,让所有需要单例功能的类继承这个基类即可。

exlink2012的专栏 978

手把手教你学simulink(26.8)--控制算法场景示例:基于强化学习的无人机姿态稳定控制系统

首先,我们需要定义无人机的姿态稳定控制环境。环境包括无人机的状态(姿态角、角速度等)和动作(电机转速)。我们还需要定义奖励函数,用于评估控制器的表现。matlab深色版本% 定义环境% 定义状态空间% 12个状态变量% 定义动作空间% 电机转速范围奖励函数用于评估控制器的表现。我们可以根据无人机的姿态误差、角速度误差以及控制输入的变化率来设计奖励函数。具体来说,当无人机的姿态接近设定值时,给予正奖励;当姿态误差较大或控制输入变化剧烈时,给予负奖励。matlab深色版本。

MHD0815的博客 494

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Uniy 组件式泛型单例模式

Uniy 组件式泛型单例模式 我们知道,在Unity中,所有对象脚本都必须继承MonoBehavior脚本,才能使用Unity内置的脚本功能; 通常我们可以用静态类来取代单例模式,但是静态类方法的缺点是,它们必须继承最底层的类----Object。这意味着静态类不能继承MonoBehaviour,因此,我们不能使用它的任何一个Unity...

lliaoguipeng13的专栏 272

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

unity模块与架构设计1 泛型单例模式

简介 有些管理器性质的类,只存在一个就可以.单例模式就是为了保证不多创建这种类,来节省消耗,另外实例是全局变量,让获取也变得方便. 代码 1. 普通单例 这个写法是在<剑指offer>这本书里学到的,有很多中单例的写法有一些缺陷,比如多线程上的,频繁使用对象锁之类的. 最终学习了这种最优最简的单例模式写法 new()这里,我第一次接触的时候也不明白他的作用. new实际有三种用法,但我...

残獄の世界に救いを 578

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

继承自MonoBehaviour的类如何实现单例

泛型单例类: public class Singleton<T> : MonoBehaviour where T : MonoBehaviour { private static T mInstance; public static T GetInstance() { if (null == mInstance) { ...

陈云佳的专栏 2389

设计模式——通用泛型单例(普通型和继承自MonoBehaviour)

单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。 普通泛型单例: 1 public abstract class Singleton<T> where T : class, new() 2 { 3 private static T instance = null; 4 5 priva...

weixin_30425949的博客 500

java 单例模式 泛型_Unity通用泛型单例设计模式(普通型和继承自MonoBehaviour)

单例模式是设计模式中最为常见的,不多解释了。但应该尽量避免使用,一般全局管理类才使用单例。普通泛型单例:public abstract class Singleton where T : class, new(){private static T instance = null;private static readonly object locker = new object();public ...

weixin_39703982的博客 183

Unity 单例模式完全指南

本文介绍了单例模式在Unity开发中的实现与应用。单例模式确保一个类仅有一个实例,并提供全局访问点,常用于游戏开发中的管理器类(如音频、UI、场景等)。由于Unity的MonoBehaviour限制,文章详细讲解了MonoBehaviour单例的标准实现方案,包括防止重复实例、跨场景持久化等关键点,并提供了泛型单例基类的进阶封装。此外,还对比了MonoBehaviour单例与普通C#单例的区别,指出常见陷阱和适用场景,建议根据需求选择合适的实现方式。最后强调避免滥用单例,可考虑Service Locator

qq_34820371的博客 1050

Unity框架之单例模式基类

在开发过程中,我们可能需要在一个项目中创建多个单例对象,这时候就到了单例模式基类发挥作用的时候。建立一个单例模式基类,让需要单例化(我自造名词)的类,继承一下这个单例模式基类,就可以实现单例模式的效果了。//使用反射,调用无参构造方法创建对象;protected SingletonPatternBase() { }//使用protected使得在调用单例无法new新对象的同时,他的子类可以正常继承他。private PlayerModel() { }//拒绝new新对象。{ //保证对象的唯一性。

shiqiaoo的博客 75

Unity WebGL泛型单例模式实战:兼容性设计与性能优化

单例模式是软件设计中常用的创建型模式,它确保一个类只有一个实例,并提供全局访问点。其核心原理是通过静态成员和私有构造函数控制实例化过程,实现资源共享和状态管理。在Unity游戏开发中,单例模式广泛应用于游戏管理器、资源加载器等场景,能有效协调系统组件间的通信。然而,当项目部署到WebGL平台时,传统的单例实现常因线程模型、初始化顺序等差异引发兼容性问题。本文针对Unity WebGL环境,深入解析泛型单例的设计原理,通过类型安全模板减少代码重复,并结合Addressables资源管理系统,探讨异步初始化、内

weixin_34259232的博客 876

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 148
上一篇: Gitlab使用入门——使用于新手小白
下一篇: 2.MonoBehaviour 单例模式
Unity黑马王子
博客等级 码龄4年 1846粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值