Unity 对单例的封装

举报
CoderZ1010 发表于 2022/09/25 07:16:36 2022/09/25
【摘要】 using System; using UnityEngine; using System.Reflection; [AttributeUsage(AttributeTargets.Class)] public class SingletonAttribute : Attribute { public bool DontDes...
using System;
using UnityEngine;
using System.Reflection;

[AttributeUsage(AttributeTargets.Class)]
public class SingletonAttribute : Attribute
{
    public bool DontDestroyOnLoad { get; }
    public SingletonAttribute(bool dontDestroyOnLoad)
    {
        DontDestroyOnLoad = dontDestroyOnLoad;
    }
}

public abstract class Singleton<T> : MonoBehaviour where T : Singleton<T>
{
    protected static T mInstance;
    public static T Instance
    {
        get
        {
            if(null == mInstance)
            {
                mInstance = CreateSingleton<T>();
            }            
            return mInstance;
        }
    }
    public static T CreateSingleton<T>() where T : Singleton<T>
    {
        T retInstance = FindObjectOfType<T>();
        if (null == retInstance)
        {
            retInstance = new GameObject(typeof(T).Name.ToString()).AddComponent<T>();           
        }
        MemberInfo mi = typeof(T);
        var attributes = mi.GetCustomAttributes(true);
        foreach (var attribute in attributes)
        {
            if (attribute is SingletonAttribute attr)
            {
                if (attr.DontDestroyOnLoad)
                {
                    DontDestroyOnLoad(retInstance);
                }
            }
        }
        return retInstance;
    }
}

需要作为单例的类,只需继承Singleton<T>

使用[Singleton(true)]属性 表示该单例物体在加载场景时做不销毁处理。

例如下例中的Foo类,继承Singleton<Foo>后,即可在其他类中进行调用 Foo.Instance.TestMethod()

[Singleton(true)]
public class Foo : Singleton<Foo>
{
    public void TestMethod()
    {
        Debug.Log("Test");
    }
}

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/109058896

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。