Unity中设计模式应用(一):单例模式

来源:互联网 发布:立林jb2000 进入编程 编辑:程序博客网 时间:2024/06/05 08:52

一.单例模式简介
定义:

    单例模式是一种常用的软件设计模式。通过单例模式可以保证系统中一个类只有一个实例存在而且该实例易于被外界访问。

特点:

        1.某个类只能有一个实例        2.它必须自行创建这个实例        3.它必须自行向整个系统提供这个实例

二.Unity泛型单例

1.实现

using UnityEngine;using System.Collections;public class UnitySingleton<T> : MonoBehaviour  where T:Component{    private static T m_Instance;    public static T instance    {        get        {            if (m_Instance == null)            {                m_Instance = FindObjectOfType (typeof(T)) as T;                if (m_Instance == null)                 {                    GameObject obj = new GameObject (typeof(T).GetType ().ToString());                    m_Instance = obj.AddComponent<T> ();                    obj.hideFlags = HideFlags.HideAndDontSave;                }            }            return m_Instance;        }    }    protected virtual void Awake()    {        DontDestroyOnLoad (this.gameObject);        if (m_Instance == null) {            m_Instance = this as T;        } else {            //说明该单例已经存在,为了保证单例的唯一性所销毁这个物体            GameObject.Destroy (this.gameObject);        }    }}

2.使用Part1

using UnityEngine;using System.Collections;public class AudioSourceManager : UnitySingleton<AudioSourceManager> {    public AudioSource audioSource;    public string path = "Swipe";    protected override void Awake ()    {        base.Awake ();        audioSource = gameObject.AddComponent<AudioSource> ();        audioSource.playOnAwake = false;    }    public void MakeSomeNoise()    {        audioSource.clip = Resources.Load (path, typeof(AudioClip)) as AudioClip;        audioSource.Play ();    }}

3.使用Part2

using UnityEngine;using System.Collections;using UnityEngine.SceneManagement;public class SingletonTest : UnitySingleton<SingletonTest> {    protected override void Awake()    {        base.Awake ();    }    // Use this for initialization    void Start () {    }    // Update is called once per frame    void Update () {        if (Input.GetKeyDown (KeyCode.M)) {            AudioSourceManager.instance.MakeSomeNoise ();        }        if (Input.GetKeyDown (KeyCode.N)) {            if (SceneManager.GetActiveScene ().name == "Singleton1") {                SceneManager.LoadSceneAsync ("Singleton2", LoadSceneMode.Single);            } else {                SceneManager.LoadSceneAsync ("Singleton1", LoadSceneMode.Single);            }        }    }}

4.场景

这里写图片描述

原创粉丝点击