Unity3D利用单例创建并永久化游戏对象(单例模式的应用)
发表于2018-09-13
单例模式(Singleton Pattern):用来创建独一无二的,只能有一个实例的对象的入场券。
作用:有些对象我们只需要一个,比如:线程池、缓存、对话框、处理偏好设置、注册表等对象,这些对象只能有一个实例,如果制造出多个实例,就会导致很多问题产生,例如:程序行为异常、资源使用过量、或者是不一致的结果。
下面就给大家分享下如何利用单例创建并实现永久化游戏对象。
基类单例类:
using UnityEngine; using System.Collections; public class SingleClass<T> : MonoBehaviour where T: MonoBehaviour{ private static T _instance; /// <summary> /// Gets the instance. /// </summary> /// <returns>The instance.</returns> public static T GetInstance() { if (_instance == null) { GameObject obj = new GameObject(); obj.name = typeof(T).ToString(); _instance = obj.AddComponent<T>(); DontDestroyOnLoad(obj); } return _instance; } }
使用方法:(实例化一个管理音效的对象)
using UnityEngine; using System.Collections; public class AudioManager : MonoBehaviour { #region variable private static AudioSource bgmSource; private static AudioManager _instance; #endregion #region Attributes #endregion public void PlayBackgroundMusic(string musicName, bool loop = false) { bgmSource.clip = Resources.Load(musicName) as AudioClip; bgmSource.loop = loop; bgmSource.Play(); } public void SetBackgroundMusicVol(float vol) { bgmSource.volume = vol; } public void ChangeBackgroundMusicStatus() { if (bgmSource.isPlaying) { bgmSource.Pause(); } else { bgmSource.UnPause(); } } public void PlayEffect(string effectName, float timer) { GameObject obj = new GameObject(); obj.name = effectName; AudioSource source = obj.AddComponent<AudioSource>(); source.clip = Resources.Load(effectName) as AudioClip; source.playOnAwake = false; source.Play(); Destroy(obj, timer); } public static AudioManager GetInstance() { if (!_instance) { GameObject obj = new GameObject(); obj.name = typeof(AudioManager).ToString(); bgmSource = obj.AddComponent<AudioSource>(); bgmSource.clip = Resources.Load("Sounds/background") as AudioClip; bgmSource.playOnAwake = false; _instance = obj.AddComponent<AudioManager>(); DontDestroyOnLoad(obj); } return _instance; } }
来自:https://blog.csdn.net/virus2014/article/details/52924950