Unity 单例
1. 继承于MonoBehaviour(不随着场景切换而销毁)
基类代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine; /// <summary>
/// 单例模式基类,继承于 MonoBehaviour,不随场景切换而销毁
/// 在场景中新建空物体 DDOL,挂载 T 类继承 DDOLSingleton<T> 即可
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class DDOLSingleton<T> : MonoBehaviour where T : DDOLSingleton<T>
{
protected static T _instance = null; public static T Instance
{
get
{
if (null == _instance)
{
GameObject go = GameObject.Find("DDOL");
if (null == go)
{
go = new GameObject("DDOL");
DontDestroyOnLoad(go);
}
_instance = go.GetComponent<T>();
if (null == _instance)
{
_instance = go.AddComponent<T>();
}
}
return _instance;
}
}
}
测试:
新建空实体 DDOL,挂载脚本 GameManage。
新建一个按钮,实现加载下一场景功能,测试是否随场景销毁而销毁。
Hierarchy :

GameManage 代码:
using System.Collections.Generic;
using UnityEngine; /// <summary>
/// 单例
/// </summary>
public class GameManage : DDOLSingleton<GameManage> {
public void TestMethod()
{
Debug.Log("GameManage");
}
}
测试代码:
/// <summary>
/// 测试单例
/// </summary>
public class Test : MonoBehaviour { // Use this for initialization
void Start () {
GameManage.Instance.TestMethod();
} // Update is called once per frame
void Update () { } public void OnBtnClick()
{
SceneManager.LoadScene();
}
}
效果图:

2. 不继承于MonoBehaviour(随着场景切换而销毁)
基类代码:
/// <summary>
/// 单例模式基类,不继承于 MonoBehaviour,随场景切换而销毁
/// 挂载 T 类继承 DDOLSingleton<T>,重载 Init 函数即可
/// </summary>
/// <typeparam name="T"></typeparam>
public abstract class Singleton<T> where T : class, new()
{
protected static T _instance = null; public static T Instance
{
get
{
if (null == _instance)
{
_instance = new T();
}
return _instance;
}
} protected Singleton()
{
if (null != _instance)
{
Debug.LogError("This " + typeof(T).ToString() + " Singleton Instance is not null !!!");
}
Init();
} public virtual void Init()
{ }
}
此时 GameManage 代码修改为:
/// <summary>
/// 测试 Singleton
/// </summary>
public class GameManage : Singleton<GameManage> {
public override void Init()
{
base.Init();
} public void TestMethod()
{
Debug.Log("GameManage");
}
}
Unity 单例的更多相关文章
- C# LINQ Unity 单例
C# LINQ 1. 自定义 Master,Kongfu 类 1 class Master 2 { 3 4 public int Id { get; set; } 5 public string ...
- unity单例封装
# 1.前言本篇主要针对Unity单例模式,完成一个可以重复继承使用的抽象类,减少重复的工作与代码.同时,对存在的多种单例进行优劣分析.# 2.Unity单例问题分析## 2.1 单例原则单例要满足以 ...
- Unity 单例写法
借鉴自:http://www.cnblogs.com/CodeCabin/p/unity_global_manager.html 实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类 ...
- C#单例和Unity单例
单例是一种设计模式 单例:不管在项目中的任何模块,当需要使用某个对象的时候,获取到的始终是同一个对象 在C#中 public class InstanceDemo{ private static In ...
- Unity单例
引自:http://www.unitymanual.com/thread-16916-1-1.html
- unity脚本的运行顺序以及单例的实现
unity引擎把所有脚本先行编译后,在运行的时候一批,一批的函数进行执行. unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> St ...
- Unity Singleton 单例类(Unity3D开发之二十)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 ...
- Unity 游戏框架搭建 (三) MonoBehaviour单例的模板
上一篇文章讲述了如何设计C#单例的模板.也随之抛出了问题: 如何设计接收MonoBehaviour生命周期的单例的模板? 如何设计? 先分析下需求: 1.约束脚本实例对象的个数. 2.约束 ...
- Unity 游戏框架搭建 (二) 单例的模板
上一篇文章中说到的manager of managers,其中每个manager都是单例的实现,当然也可以使用静态类实现,但是相比于静态类的实现,单例的实现更为通用,可以适用大多数情况. 如何设计 ...
随机推荐
- 监听器(Listener)学习(二)
一.监听域对象中属性的变更的监听器 域对象中属性的变更的事件监听器就是用来监听 ServletContext, HttpSession, HttpServletRequest 这三个对象中的属性变更信 ...
- 三分钟教你同步 Visual Studio Code 设置
简介 Visual Studio Code(以下简称vsCode)现在已经渐渐成为前端开发的主力工具,谁让它这么轻便,功能又这么轻便呢.用vscode Coding的小伙伴们也一定会装很多插件吧. ...
- log4j打印mybatis执行sql,将占位符换成真实的参数输出
背景: 在我日常码代码的时候,由于对mybatis的动态sql,比较依赖,并且有时候需求复杂,导致sql较长,而且参数众多,当出现问题是,需要将sql,放到navicat里面去执行查看结果,但是对于复 ...
- PHP与理在事先
编程语言的应用选择,大家有各种各样的看法.高级语言有C,C++,C#,面向对象语言的典型代表Java是从信息电器发展的,因此有它的优势,也有它的局限.新编程语言族则有PHP,Ruby,Python,R ...
- Nexus搭建私服
什么是Nexus Nexus是一个强大的Maven仓库管理器,它极大地简化了本地内部仓库的维护和外部仓库的访问. 运行原理 本地仓库与私服处在同一个局域网中,当本地仓库没有资源时,会向私服发起请求获取 ...
- ***XX-net 和 proxyee-down
看连接吧,留着方便自己查看 https://github.com/XX-net/XX-Net https://github.com/monkeyWie/proxyee-down/blob/master ...
- 谈谈JS中的高级函数
博客原文地址:Claiyre的个人博客如需转载,请在文章开头注明原文地址 在JavaScript中,函数的功能十分强大.它们是第一类对象,也可以作为另一个对象的方法,还可以作为参数传入另一个函数,不仅 ...
- 骰子点数概率__dp
骰子点数概率 时间限制:1 秒 内存限制:32 兆 题目描述: 把n个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入n,打印出S的所有可能的值出现的概率. 输入: 输入包括一个整数N(1<= ...
- SharePoint自动登录问题
SharePoint使用Windows身份验证,默认会弹出Windows验证登录框,如下图所示: 1.对于已经加域的客户端,可通过如下方式解决 IE安全设置,将站点加信任站点,然后修改信任站点安全设置 ...
- 理解加密算法——创建CA机构,签发证书并开始TLS通信
1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下,NODE.JS代码: TCP Server: const net=requir ...