目录
1.单件脚本,需提前挂载到场景内
using UnityEngine;
using System.Collections;
public class SingletonA : MonoBehaviour {
//第一种单例:单件脚本
public static SingletonA Instance{get;private set;}
void Awake()
{
Instance = this;
}
public void Test()
{
print("SingletonA");
}
}
2.自动挂载,跨场景不销毁(尽量不要挂载多个)
using UnityEngine;
/// <summary>
/// singleton 不需要手动拖拽给游戏物体
/// </summary>
public class SingletonB : MonoBehaviour
{
private static SingletonB instance;
public static SingletonB Instance
{
get
{
if (instance == null)
{
SingletonB[] sts = FindObjectsOfType<SingletonB>();
if (sts.Length > 0)
{
for (int i = 0; i < sts.Length; i++)
{
Debug.LogWarning(sts[i].gameObject.name + " is already Added SingletonB");
Destroy(sts[i]);
}
}
GameObject obj = new GameObject("B");
instance = obj.AddComponent<SingletonB>();
DontDestroyOnLoad(obj);//跨场景不销毁游戏物体
}
return instance;
}
}
public void Test()
{
print("SingletonB");
}
}
3.单例模板类,泛型单例
using UnityEngine;
using System.Collections;
/// <summary>
/// 单例模板类
/// </summary>
public class Singleton<T> : MonoBehaviour where T : MonoBehaviour
{
private static T instance;
public static T Instance
{
get
{
if (instance == null)
{
GameObject obj = new GameObject();
obj.name = typeof(T).Name + "<Singleton>";
instance = obj.AddComponent<T>();
DontDestroyOnLoad(obj);
}
return instance;
}
}
}
使用方法,例如音乐管理类
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(AudioSource))]//如果没有组件添加组件
public class MusicManager : Singleton<MusicManager>
{
private AudioSource _audio;//音乐播放器
private AudioClip music;//背景音乐
private bool isInitialized;//表示是否初始化
void Init()
{
_audio = GetComponent<AudioSource>();
music = Resources.Load("bg") as AudioClip;
_audio.clip = music;
isInitialized = true;
}
public void Play()
{
if (!isInitialized)
{
Init();
}
_audio.Play();
}
}
4.测试
A需要提前挂载,B和音乐管理类自动生成
using UnityEngine;
using System.Collections;
public class Test : MonoBehaviour {
void Start () {
SingletonA.Instance.Test();
SingletonB.Instance.Test();
MusicManager.Instance.Play();
}
}