MMO_1_准备阶段_4_三种单例的写法和使用

前言:之前我总结过很多次的单例的写法,并且在另外一个论坛上些发表过文章,这里我就把之前写的重新总结一下(其实就是搬运)

单例有很多种写法,有比较粗暴的,也有稍许复杂一点的,在我开发和学习的过程中,我总结了3种情况下的单例的写法和用法。

一、不继承Monobehaviour的单例
这种单例是不挂载到GameObject上的,下面是详细的代码:

public abstract class Singleton<T> where T : class, new()
{
    private static T _instance = null;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = new T();
            }
            return _instance;
        }
    }
}

二、继承Monobehaviour的单例
这种单例是需要挂载到GameObject上的,下面是详细的代码:

using UnityEngine;

public abstract class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T>
{
    private static T _instance = null;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                _instance = GameObject.FindObjectOfType(typeof(T)) as T;
            }
            return _instance;
        }
    }
}

三、继承Monobehaviour,并且不随场景的切换而销毁的单例
这种单例是必须挂载到GameObject上的,并且呢它不会随着场景的切换而销毁的,详细的代码如下:

using UnityEngine;

public class DontDesSingleton<T> : MonoBehaviour where T : DontDesSingleton<T>
{
    private static T _instance = null;

    public static T Instance
    {
        get
        {
            if (_instance == null)
            {
                GameObject obj = GameObject.Find("DontDestroy");
                if (obj == null)
                {
                    obj = new GameObject("DontDestroy");
                    DontDestroyOnLoad(obj);
                }

                _instance = obj.GetComponent<T>();
                if (_instance == null)
                {
                    _instance = obj.AddComponent<T>();
                }
            }

            return _instance;
        }
    }
}

四、使用方法
1.创建脚本 UseSingleton.cs,代码如下:

using UnityEngine;

public class UseSingleton : Singleton<UseSingleton>
{
    public void TestMethod()
    {
        Debug.Log("测试使用UseSingleton.TestMethod()方法");
    }

}

2.创建脚本 UseMonoSingleton.cs,并且在Hierarchy中创建空物体,并改名为“TestMonoSingleton”,将脚本UseMonoSingleton.cs挂载到TestMonoSingleton物体上,代码如下:

using UnityEngine;

public class UseMonoSingleton : MonoSingleton<UseMonoSingleton> 
{

    public void TestMethod()
    {
        Debug.Log("测试使用UseMonoSingleton.TestMethod()方法!");
    }
}

3.创建脚本 UseDontDesSingletonAA.cs,代码如下:

public class UseDontDesSingletonAA : DontDesSingleton<UseDontDesSingletonAA> 
{
    public void TestMethod()
    {
        Debug.Log("UseDontDesSingletonAA.TestMethod()");
    }
}

4.创建一个脚本ScenesCtrl.cs,该脚本需要挂载到主摄像机中,代码如下:

using UnityEngine;

public class ScenesCtrl : MonoBehaviour
{
    private void Update()
    {
        if (Input.GetMouseButtonUp(0))
        {
            UseSingleton.Instance.TestMethod();
            UseMonoSingleton.Instance.TestMethod();
        }

        if (Input.GetKeyUp(KeyCode.A))
        {
            UseDontDesSingletonAA.Instance.TestMethod();
        }

        if (Input.GetKeyUp(KeyCode.B))
        {
            UseDontDesSingletonBB.Instance.TestMethod();
        }

        if (Input.GetKeyUp(KeyCode.C))
        {
            UseDontDesSingletonCC.Instance.TestMethod();
        }
    }
}

5.最终运行的结果图如下面所示:
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值