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 单例的更多相关文章

  1. C# LINQ Unity 单例

    C# LINQ   1. 自定义 Master,Kongfu 类 1 class Master 2 { 3 4 public int Id { get; set; } 5 public string ...

  2. unity单例封装

    # 1.前言本篇主要针对Unity单例模式,完成一个可以重复继承使用的抽象类,减少重复的工作与代码.同时,对存在的多种单例进行优劣分析.# 2.Unity单例问题分析## 2.1 单例原则单例要满足以 ...

  3. Unity 单例写法

    借鉴自:http://www.cnblogs.com/CodeCabin/p/unity_global_manager.html 实现复杂一些的全局控制,如切换游戏关卡等操作,更常用的方式是使用单例类 ...

  4. C#单例和Unity单例

    单例是一种设计模式 单例:不管在项目中的任何模块,当需要使用某个对象的时候,获取到的始终是同一个对象 在C#中 public class InstanceDemo{ private static In ...

  5. Unity单例

    引自:http://www.unitymanual.com/thread-16916-1-1.html

  6. unity脚本的运行顺序以及单例的实现

    unity引擎把所有脚本先行编译后,在运行的时候一批,一批的函数进行执行. unity脚本自带函数执行顺序如下:将下面脚本挂在任意物体运行即可得到 Awake ->OnEable-> St ...

  7. Unity Singleton 单例类(Unity3D开发之二十)

    猴子原创,欢迎转载.转载请注明: 转载自Cocos2Der-CSDN,谢谢! 原文地址: http://blog.csdn.net/cocos2der/article/details/47335197 ...

  8. Unity 游戏框架搭建 (三) MonoBehaviour单例的模板

      上一篇文章讲述了如何设计C#单例的模板.也随之抛出了问题: 如何设计接收MonoBehaviour生命周期的单例的模板? 如何设计? 先分析下需求:   1.约束脚本实例对象的个数.   2.约束 ...

  9. Unity 游戏框架搭建 (二) 单例的模板

      上一篇文章中说到的manager of managers,其中每个manager都是单例的实现,当然也可以使用静态类实现,但是相比于静态类的实现,单例的实现更为通用,可以适用大多数情况. 如何设计 ...

随机推荐

  1. HihoCoder1049 后序遍历 分治水题

    水题,是为了给难题(树形DP)做铺垫 描述 在参与过了美食节之后,小Hi和小Ho在别的地方又玩耍了一阵子,在这个过程中,小Ho得到了一个非常有意思的玩具——一棵由小球和木棍连接起来的二叉树! 小Ho对 ...

  2. linux自学(四)之开始centos学习,网络配置

    上一篇:linux自学(三)之开启虚拟机 安装好镜像之后,重启之后需要登录,我这里直接是root账号直接登录的,注意:输入密码的时候不显示. 之后输入ifconfig最常用的命令来查看网卡信息,出现c ...

  3. windows下gvim中文乱码解决方案

    网罗了一些网上的解决windows下gvim中文乱码的解决方案,都试了一遍,可惜都不能完全解决我的所有问题,最后我综合一下网上的两种方案,得到了最后完全解决我的中文乱码问题的方案,配置很简单,就是把下 ...

  4. 【BZOJ4025】二分图 LCT

    [BZOJ4025]二分图 Description 神犇有一个n个节点的图.因为神犇是神犇,所以在T时间内一些边会出现后消失.神犇要求出每一时间段内这个图是否是二分图.这么简单的问题神犇当然会做了,于 ...

  5. hashids 了解

    用于隐藏真实的id 原理是从数字经过一个加盐(salted)算法产生一个哈希(hash)字符串.这样算法就是通过混淆使结果具有不可预测性,而唯一性依然由数字本身来达成,从而得到(类似 youtube ...

  6. oracle之 RAC Interconnect之HAIP

    0. 背景 Oracle 从11.2.0.2开始引入了一个新特性叫做Redundant Interconnect,简称HAIP.HAIP的目的用来代替操作系统级别的网卡绑定以实现Active-Acti ...

  7. ubuntu技巧

    在终端界面里面查找,命令:ctrl + shift +f VMware 中 Ubuntu 不能全屏: 转到虚拟机-->安装VMware Tools 把装载的 VMware Tools CD里面的 ...

  8. POJ2503:Babelfish

    浅谈\(Trie\):https://www.cnblogs.com/AKMer/p/10444829.html 题目传送门:http://poj.org/problem?id=2503 \(Trie ...

  9. (一)Fiddler的介绍和安装

    一.Fiddler的介绍和安装 Fildder是一款免费的web调试代理工具,支持任何浏览器.系统或平台. 官网地址:https://www.telerik.com/fiddler Fiddler原理 ...

  10. oracle的时间

    今天发现之前从oracle导出的数据时间格式很奇怪: "ACTIVETIME","ACTIVITYID" "2018-08-10 06:08:43&q ...