Unity模板单例类的两种写法

1.不继承至MonoBehaviour的普通C#单例类

using System.Collections.Generic;
using UnityEngine;

public class NormalSingleton<T> where T : class,new()
{
    
    
    private static T instance;

    public static T Instance
    {
    
    
        get
        {
    
    
            if(instance == null)
            {
    
    
                T t = new T();
                if (t is MonoBehaviour)
                {
    
    
                    Debug.LogError("改类不是普通类,需要继承MonoSingleton");
                    return null;
                }
                instance = t;
            }
            return instance;
        }
    }
}

2.继承至MonoBehaviour的单例类,继承至MonoBehaviour的单例往往会比较麻烦,因为当我们在切换场景的时候这个单例就被销毁了,那么这个时候可以写上DontDestoryLoad方法,但是如果从其他场景切换为原本挂载了单例脚本的场景就会出现两个单例,所以在Awake中对这种情况进行了解决。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MonoSingleton<T> : MonoBehaviour where T :  MonoBehaviour
{
    
    
    private static T instance;

    public static T Instance
    {
    
    
        get
        {
    
    
            if(instance == null)
            {
    
    
                instance = FindObjectOfType<T>();
                if (instance == null)
                {
    
    
                    Debug.LogError("没有在场景中找到该类,该类的类名为:" + typeof(T).Name);
                    return null;
                }

            }
            return instance;
        }
    }

    private void Awake()
    {
    
    
        if (instance == null)
        {
    
    
            DontDestroyOnLoad(gameObject);
        }
        else
        {
    
    
            Destroy(instance);
        }
            
    }

}

猜你喜欢

转载自blog.csdn.net/qq_41884036/article/details/107902782