您的位置:

Unity单例的实现

一、单例模式简介

单例模式是一种常见的设计模式,它保证了一个类只有一个实例,且该实例易于被外部访问,用于全局资源的调度与管理。

在 Unity 中,单例模式也是一种常见的设计模式,可以用于管理游戏中的全局资源,比如音效管理器、数据管理器、界面管理器等等。

二、单例的实现方式

在 Unity 中,常见的实现单例模式的方式有静态类、饿汉式、懒汉式以及基于 MonoBehavious 的单例模式。

1. 静态类

public static class Singleton
{
    private static int count = 0;
 
    public static void AddCount()
    {
        count++;
        Debug.Log("Count = " + count);
    }
}

静态类指的是全局只有一个类,不能创建该类的实例。使用静态类实现单例模式,可以通过静态变量或静态方法的方式进行调用。比如上面的代码,我们用一个静态变量 count 和一个静态方法 AddCount 实现单例模式。

2. 饿汉式单例模式

public class Singleton
{
    private static readonly Singleton instance = new Singleton();
 
    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
 
    private Singleton()
    {
    }
}

饿汉式单例模式指的是在类加载的时候就创建好实例,从而保证了全局只有一个实例的方式。比如上面的代码,我们在类中创建了一个私有的静态实例 instance,并将该实例作为 get 属性 Instance 的返回值。

3. 懒汉式单例模式

public class Singleton
{
    private static Singleton instance;
 
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = new Singleton();
            }
            return instance;
        }
    }
 
    private Singleton()
    {
    }
}

懒汉式单例模式指的是在使用到实例的时候才创建它,从而避免了饿汉式单例模式带来的可能的性能问题。比如上面的代码,我们在 get 属性 Instance 中判断实例是否为空,如果为空就创建一个实例。

4. 基于 MonoBehaviour 的单例模式

public class Singleton : MonoBehaviour
{
    private static Singleton instance;
 
    public static Singleton Instance
    {
        get
        {
            if (instance == null)
            {
                instance = FindObjectOfType(typeof(Singleton)) as Singleton;
            }
            return instance;
        }
    }
 
    private void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject);
        }
        else if (instance != this)
        {
            Destroy(gameObject);
        }
    }
}

和常规的单例模式不同的是,在 Unity 中我们还可以利用 MonoBehaviour 的生命周期函数实现单例模式。上面的代码使用了 FindObjectOfType 方法获取该脚本的实例,当实例不存在时则创建该实例。同时,在 Awake 方法中我们对该实例进行了初始化,并使用 DontDestroyOnLoad 方法保证了该实例在场景切换时不会被销毁。

三、Unity单例的应用场景

单例模式应用于全局资源的调度与管理,具有如下几种特点:

  • 保证了全局只有一个实例,避免了频繁地重复创建、销毁对象,从而提高了性能。
  • 易于被外部访问,方便了全局资源的调度与管理。
  • 方便了程序的扩展。如果需要增加一个全局资源时,只需要在已有的单例中加入一个方法即可。

在 Unity 中,常见的应用场景包括音效管理器、数据管理器、界面管理器等等。最常见的是音效管理器,因为音效管理器需要频繁地播放和停止音效,在单例模式下可以很方便地调度全局音效资源。

四、总结

本文介绍了 Unity 单例模式的实现方式,包括静态类、饿汉式、懒汉式以及基于 MonoBehaviour 的单例模式。同时,我们还介绍了单例模式的应用场景,说明了单例模式在游戏开发中的重要性和实际运用价值。