///
/// 单例基类
///
//泛型解决,给他一个约束要么是这个类本身要么是它的子类
public class SingleBasewhere T : SingleBase
{
protected SingleBase() { }
//线程锁。当多线程访问时,同一时刻仅允许一个线程访问。
private static object locker=new object();
//volatile关键字修饰字段是当多个线程都对他进行修改时,确保这个字段在任何时刻呈现都是最新的值
private volatile static T _instance;
public static T Instance
{
get
{
//双重保证对象的唯一性
if (_instance == null)
{
lock (locker)
{
if (_instance == null)
{
//使用反射调用无参构造方法创建对象,就是new一个对象的意思
_instance = Activator.CreateInstance(typeof(T), true) as T;
}
}
}
return _instance;
}
}
}
继承单例基类就不用再写了
public class PlayerModel:SingleBase
{
private PlayerModel() { }
public int money=1000;
public int diamond = 888;
public void Show()
{
Debug.Log(money);
Debug.Log(diamond);
}
}
PlayerModel.Instance.Show();
///
/// 继承monobehaviour的单例基类,前面是继承,where后面是泛型约束,要么是本身,要么是继承monobehaviour
///
public class SingleMonoBase : MonoBehaviour where T : MonoBehaviour
{
protected SingleMonoBase() { }
//声明一个isExisted属性用来表示单例对象是否存在,用来记录单例对象是否存在,用于防止在OnDestroy方法中访问单例对象报错。
public static bool isExisted { get; private set; } = false;
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance=FindObjectOfType();
if (_instance == null)
{
//通过反射获取T类型的名字,typeof(T)就是获取T类型的信息,创建游戏对象挂载脚本
GameObject go = new GameObject(typeof(T).Name);
_instance = go.AddComponent();
DontDestroyOnLoad(go);
isExisted = true;
}
}
return _instance;
}
}
//在子类中也可能有OnDestroy用protected修饰可以访问了,子类可能重写这个方法还要写关键字virtual成为虚方法让子类重写他
protected virtual void OnDestroy()
{
isExisted=false;
}
}
public class YaoUIManager : SingleMonoBase
{
private YaoUIManager() { }
public void yao()
{
Debug.Log("yaoyao");
}
}}
YaoUIManager.Instance.yao();
五种方法
using System.Resources;
using UnityEngine.Events;
///
/// 封装resourcesManager的异步加载
///
public class ResourcesManager : SingleMonoBase
{
///
/// 同步加载Resources文件夹中指定类型的资源
/// 如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。
///
/// 要加载的资源的类型
/// 资源的路径
///
public T Load(string path)where T:Object
{
return Resources.Load(path);
}
public T[] LoadAll(string path) where T : Object
{
return Resources.LoadAll(path);
}
///
/// 异步加载Resources文件夹中指定类型的资源
/// 如果有多个相同类型,且相同路径的资源,则只会加载找到的第一个资源。
///
/// 加载的资源的类型
/// 要加载的资源的路径
/// 资源加载完毕后要执行的逻辑
public void LoadAsync(string path,UnityAction callback=null)where T : Object
{
StartCoroutine(LoadAsyncCoroutine(path,callback));
}
IEnumerator LoadAsyncCoroutine(string path,UnityAction callback=null) where T : Object
{
ResourceRequest resourceRequest= Resources.LoadAsync(path);//开始加载资源
yield return resourceRequest;//等待资源加载完毕
callback?.Invoke(resourceRequest.asset as T);
}
public void UnloadUnusedAssets(UnityAction callback=null)
{
MonoManager.Instance.StartCorotine(UnloadUnusedAssetCoroutine(callback));
}
IEnumerator UnloadUnusedAssetCoroutine(UnityAction callback=null)
{
AsyncOperation asyncOperation = Resources.UnloadUnusedAssets();//开始卸载资源
while (asyncOperation.progress < 1)
{
yield return null;
}
//资源卸载完毕后执行的逻辑
callback?.Invoke();
}
}
GameObject go = ResourcesManager.Instance.Load("Prefabs/Cube");
GameObject[] gos = ResourcesManager.Instance.LoadAll("Prefabs");
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
///
/// 音频管理器
///
public class AudioManager : SingleMonoBase
{
//各个声道的AudioSource组件
AudioSource bgmAudiosource;
AudioSource bgsAudiosource;
AudioSource voiceAudiosource;
//各个声道的游戏对象
GameObject bgmController;
GameObject soundController;
GameObject bgsController;
GameObject msController;
GameObject voiceController;
private void Awake()
{
//背景音乐控制
bgmController = CreatController("BGMController");
bgmAudiosource = bgmController.GetComponent();
bgmAudiosource.playOnAwake = false;
bgmAudiosource.loop = true;
//音效控制
soundController = CreatController("SoundController");
bgsAudiosource = bgmController.GetComponent();
bgsAudiosource.loop=true;
msController = CreatController("MSController");
//声音控制
voiceController = CreatController("VoiceController");
voiceAudiosource=voiceController.GetComponent();
voiceAudiosource.playOnAwake=false;
voiceAudiosource.loop = false;
}
//创建控制器
GameObject CreatController(string name)
{
GameObject go=new GameObject(name);
go.transform.SetParent(transform);
return go;
}
}
AudioManager.Instance.PlayBGM(BGM_1);
AudioManager.Instance.PauseBGM(BGM_1);
AudioManager.Instance..UnPauseBGM(BGM_1);
AudioManager.Instance.StopBGM(BGM_1);
AudioManager.Instance.PlaySound(Sound_1,new Vector3(1,2,3));
AudioManager.Instance.PauseSound(Sound_1,GameObject.Find("Gold"));
AudioManager.Instance..UnPauseSound(BGM_1);
AudioManager.Instance.StopSound(BGM_1);