Unity 單例模式範例


建立時間: 2023年5月14日 10:51
更新時間: 2023年5月14日 18:07

說明

單例模式 (Singleton) 是一種軟體設計模式,旨在確保在整個應用程式中只有一個實例(instance)存在並且可以全局訪問。

因為單例模式是一種概念,所以它會衍生出很多種實作,本篇將分享在 Unity 使用單例模式的範例,讀者可以參考範例,進而實作自己的單例模式腳本。

依賴空遊戲物件

這個範例需要建立一個空的遊戲物件,並把單例腳本添加上去。

以下是一個音樂播放器的腳本

MusicPlayer.cs

using UnityEngine;
using UnityEngine.SceneManagement;

/// <summary>
/// 音樂播放器
/// </summary>
public class MusicPlayer : MonoBehaviour
{
    private AudioSource audioSource;
    private static MusicPlayer instance;

    /// <summary>
    /// 自身音源
    /// </summary>
    public AudioSource AudioSource
    {
        get => audioSource;
    }

    /// <summary>
    /// 單例實體
    /// </summary>
    public static MusicPlayer Instance
    {
        get => instance;
    }

    private void Awake()
    {
        if (instance != null)
        {
            Destroy(gameObject);

            return;
        }
        instance = this;
        DontDestroyOnLoad(gameObject);

        audioSource = GetComponent<AudioSource>();
    }
}

使用範例:
在場景建立一個空物件,並添加 AudioSource, MusicPlayer 組件,接著就可以在其他腳本呼叫。

// 靜音
MusicPlayer.Instance.AudioSource.volume = 0f;

純腳本單例模式

純腳本單例模式無需建立空遊戲物件,它會自動生成,只需呼叫腳本的 Instance 即可。

以下是音效播放器的範例,跟音樂播放器大同小異。

SoundPlayer.cs

using UnityEngine;

/// <summary>
/// 音效播放器,使用單例,無需建立遊戲物件
/// </summary>
public class SoundPlayer : MonoBehaviour
{
    private AudioSource audioSource;
    private static SoundPlayer instance;

    public static SoundPlayer Instance
    {
        get
        {
            if (instance == null)
            {
                CreateInstance();
            }

            return instance;
        }
    }

    /// <summary>
    /// AudioSource 組件
    /// </summary>
    public AudioSource AudioSource
    {
        get => audioSource;
    }

    /// <summary>
    /// 初始化實體
    /// </summary>
    private static void CreateInstance()
    {
        instance = new GameObject("SoundPlayer").AddComponent<SoundPlayer>();
        instance.audioSource = instance.gameObject.AddComponent<AudioSource>();
        DontDestroyOnLoad(instance.gameObject);
    }
}

使用範例:

SoundPlayer.Instance.AudioSource.PlayOneShot(audioClip);
觀看次數: 1431
patternsingletonunity單例單例模式模式
按讚追蹤 Enjoy 軟體 Facebook 粉絲專頁
每週分享資訊技術

一杯咖啡的力量,勝過千言萬語的感謝。

支持我一杯咖啡,讓我繼續創作優質內容,與您分享更多知識與樂趣!