Unity 对单例的封装
【摘要】
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)