• unity 实用框架


    单例模式基类

    类不继承mono的单例基类

    1. ///
    2. /// 单例基类
    3. ///
    4. //泛型解决,给他一个约束要么是这个类本身要么是它的子类
    5. public class SingleBase<T>where T : SingleBase<T>
    6. {
    7. protected SingleBase() { }
    8. //线程锁。当多线程访问时,同一时刻仅允许一个线程访问。
    9. private static object locker=new object();
    10. //volatile关键字修饰字段是当多个线程都对他进行修改时,确保这个字段在任何时刻呈现都是最新的值
    11. private volatile static T _instance;
    12. public static T Instance
    13. {
    14. get
    15. {
    16. //双重保证对象的唯一性
    17. if (_instance == null)
    18. {
    19. lock (locker)
    20. {
    21. if (_instance == null)
    22. {
    23. //使用反射调用无参构造方法创建对象,就是new一个对象的意思
    24. _instance = Activator.CreateInstance(typeof(T), true) as T;
    25. }
    26. }
    27. }
    28. return _instance;
    29. }
    30. }
    31. }

    继承单例基类就不用再写了

    1. public class PlayerModel:SingleBase<PlayerModel>
    2. {
    3. private PlayerModel() { }
    4. public int money=1000;
    5. public int diamond = 888;
    6. public void Show()
    7. {
    8. Debug.Log(money);
    9. Debug.Log(diamond);
    10. }
    11. }
    PlayerModel.Instance.Show();

    类继承mono的单例基类

    1. ///
    2. /// 继承monobehaviour的单例基类,前面是继承,where后面是泛型约束,要么是本身,要么是继承monobehaviour
    3. ///
    4. public class SingleMonoBase<T> : MonoBehaviour where T : MonoBehaviour
    5. {
    6. protected SingleMonoBase() { }
    7. //声明一个isExisted属性用来表示单例对象是否存在,用来记录单例对象是否存在,用于防止在OnDestroy方法中访问单例对象报错。
    8. public static bool isExisted { get; private set; } = false;
    9. private static T _instance;
    10. public static T Instance
    11. {
    12. get
    13. {
    14. if (_instance == null)
    15. {
    16. _instance=FindObjectOfType();
    17. if (_instance == null)
    18. {
    19. //通过反射获取T类型的名字,typeof(T)就是获取T类型的信息,创建游戏对象挂载脚本
    20. GameObject go = new GameObject(typeof(T).Name);
    21. _instance = go.AddComponent();
    22. DontDestroyOnLoad(go);
    23. isExisted = true;
    24. }
    25. }
    26. return _instance;
    27. }
    28. }
    29. //在子类中也可能有OnDestroy用protected修饰可以访问了,子类可能重写这个方法还要写关键字virtual成为虚方法让子类重写他
    30. protected virtual void OnDestroy()
    31. {
    32. isExisted=false;
    33. }
    34. }
    1. public class YaoUIManager : SingleMonoBase<YaoUIManager>
    2. {
    3. private YaoUIManager() { }
    4. public void yao()
    5. {
    6. Debug.Log("yaoyao");
    7. }
    8. }}
    YaoUIManager.Instance.yao();

    资源加载管理器

    五种方法

    1. inspector窗口拖拽,Instantiate(go);
    2. resources.Load方法、Resources.LoadAsync方法、Resources.LoadAll方法来加载资源。Resources文件夹只能存储2G左右的资源,要谨慎使用,不支持热更新。
    3. AssetBundle.LoadFormXXX方法来加载资源。
    4. Addressables(可寻址资源系统),理解为高级的AssetBundle,资源管理由unity内部自动完成。目前还在发展中,可能有bug。
    5. AssetDatabase.LoadAssetAtPath方法来加载资源,仅限于编辑器模式,主要用于再编辑器模式下用代码改变本地文件。
    1. using System.Resources;
    2. using UnityEngine.Events;
    3. ///
    4. /// 封装resourcesManager的异步加载
    5. ///
    6. public class ResourcesManager : SingleMonoBase<ResourcesManager>
    7. {
    8. ///
    9. /// 同步加载Resources文件夹中指定类型的资源
    10. /// 如果有多个相同类型,且相同路径的资源,则只会返回找到的第一个资源。
    11. ///
    12. /// 要加载的资源的类型
    13. /// 资源的路径
    14. ///
    15. public T Load<T>(string path)where T:Object
    16. {
    17. return Resources.Load(path);
    18. }
    19. public T[] LoadAll<T>(string path) where T : Object
    20. {
    21. return Resources.LoadAll(path);
    22. }
    23. ///
    24. /// 异步加载Resources文件夹中指定类型的资源
    25. /// 如果有多个相同类型,且相同路径的资源,则只会加载找到的第一个资源。
    26. ///
    27. /// 加载的资源的类型
    28. /// 要加载的资源的路径
    29. /// 资源加载完毕后要执行的逻辑
    30. public void LoadAsync<T>(string path,UnityAction callback=null)where T : Object
    31. {
    32. StartCoroutine(LoadAsyncCoroutine(path,callback));
    33. }
    34. IEnumerator LoadAsyncCoroutine<T>(string path,UnityAction callback=null) where T : Object
    35. {
    36. ResourceRequest resourceRequest= Resources.LoadAsync(path);//开始加载资源
    37. yield return resourceRequest;//等待资源加载完毕
    38. callback?.Invoke(resourceRequest.asset as T);
    39. }
    40. public void UnloadUnusedAssets(UnityAction callback=null)
    41. {
    42. MonoManager.Instance.StartCorotine(UnloadUnusedAssetCoroutine(callback));
    43. }
    44. IEnumerator UnloadUnusedAssetCoroutine(UnityAction callback=null)
    45. {
    46. AsyncOperation asyncOperation = Resources.UnloadUnusedAssets();//开始卸载资源
    47. while (asyncOperation.progress < 1)
    48. {
    49. yield return null;
    50. }
    51. //资源卸载完毕后执行的逻辑
    52. callback?.Invoke();
    53. }
    54. }
    1. GameObject go = ResourcesManager.Instance.Load("Prefabs/Cube");
    2. GameObject[] gos = ResourcesManager.Instance.LoadAll("Prefabs");

    音频管理器

    1. using System.Collections;
    2. using System.Collections.Generic;
    3. using UnityEngine;
    4. ///
    5. /// 音频管理器
    6. ///
    7. public class AudioManager : SingleMonoBase<AudioManager>
    8. {
    9. //各个声道的AudioSource组件
    10. AudioSource bgmAudiosource;
    11. AudioSource bgsAudiosource;
    12. AudioSource voiceAudiosource;
    13. //各个声道的游戏对象
    14. GameObject bgmController;
    15. GameObject soundController;
    16. GameObject bgsController;
    17. GameObject msController;
    18. GameObject voiceController;
    19. private void Awake()
    20. {
    21. //背景音乐控制
    22. bgmController = CreatController("BGMController");
    23. bgmAudiosource = bgmController.GetComponent();
    24. bgmAudiosource.playOnAwake = false;
    25. bgmAudiosource.loop = true;
    26. //音效控制
    27. soundController = CreatController("SoundController");
    28. bgsAudiosource = bgmController.GetComponent();
    29. bgsAudiosource.loop=true;
    30. msController = CreatController("MSController");
    31. //声音控制
    32. voiceController = CreatController("VoiceController");
    33. voiceAudiosource=voiceController.GetComponent();
    34. voiceAudiosource.playOnAwake=false;
    35. voiceAudiosource.loop = false;
    36. }
    37. //创建控制器
    38. GameObject CreatController(string name)
    39. {
    40. GameObject go=new GameObject(name);
    41. go.transform.SetParent(transform);
    42. return go;
    43. }
    44. }
    1. AudioManager.Instance.PlayBGM(BGM_1);
    2. AudioManager.Instance.PauseBGM(BGM_1);
    3. AudioManager.Instance..UnPauseBGM(BGM_1);
    4. AudioManager.Instance.StopBGM(BGM_1);
    5. AudioManager.Instance.PlaySound(Sound_1,new Vector3(1,2,3));
    6. AudioManager.Instance.PauseSound(Sound_1,GameObject.Find("Gold"));
    7. AudioManager.Instance..UnPauseSound(BGM_1);
    8. AudioManager.Instance.StopSound(BGM_1);

  • 相关阅读:
    解决mysql Packet for query is too large
    ninja编译方法介绍
    Maven高级
    virtio device type : Block Device
    微信小程序文本横向无缝滚动
    高等数学(第七版)同济大学 习题1-10 个人解答
    java家用电器springboot家电销售网站管理系统
    [lesson60]数组类模板
    springboot整合redis
    基于仿生机理的内生安全防御体系研究
  • 原文地址:https://blog.csdn.net/qq_34113388/article/details/133090900