欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 14_音乐播放服务_字典缓存避免重复加载

14_音乐播放服务_字典缓存避免重复加载

2025/2/6 3:41:39 来源:https://blog.csdn.net/weixin_69360830/article/details/145301249  浏览:    关键词:14_音乐播放服务_字典缓存避免重复加载

首先在游戏根入口下创建空节点

F2重命名为BGAudio 作为播放 背景音乐的对象

在BGAudio对象上挂载组件 AudioSource

关掉PlayOnAwake

因为我们需要通过代码来控制音效

音量大小设置为0.5

Ctrl  + d 再复制一份背景播放对象BGAudio

重命名为UIAudio 作为UI窗口操作的播放对象

创建脚本 AudioSvc.cs

编写脚本 音乐播放服务 很多地方需要用到 所以设置成单例 增加一个初始化方法

using UnityEngine;
//功能 : 音乐播放服务
public class AudioSvc : MonoBehaviour{public static AudioSvc Instance;public void InitSvc(){Instance = this;Debug.Log("Init AudioSvc...");}
}

在游戏根入口GameRoot.cs添加音乐播放服务的初始化函数

因为GameRoot.cs用到GetComponent<>()组件 所以需要将 AudioSvc.cs要挂载至GameRoot对象身上

继续编写音乐播放服务脚本AudioSvc.cs

对场景对象进行关联

拿到这两个组件之后我们就可以利用这两个组件来播放音效

这里我们需要资源服务ResSvc.cs的函数 所以在资源服务ResSvc.cs中添加函数

现在我们在项目中添加一个音乐资源

先在Resources文件夹下创建一个空文件命名为ResAudio

导入资源文件

继续编写代码 - 资源加载服务层ResSvc.cs

using System;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement; //异步加载 命名空间
//功能 : 资源加载服务
public class ResSvc : MonoBehaviour{#region 单例模式public static ResSvc Instance = null;#endregionpublic void InitSvc(){#region 单例模式Instance = this;#endregionDebug.Log("Init ResSvc...");}#region 【委托】更新回调 进度值Action prgCB = null;#endregion//自定义异步加载public void AsyncLoadScene(string sceneName,Action loaded) {#region 窗口基类的好处GameRoot.Instance.loadingWnd.SetWndState();#endregion//拿到异步操作AsyncOperation sceneAsync = SceneManager.LoadSceneAsync(sceneName);#region 【委托】更新回调 进度值//Lamd表达式prgCB = () =>{//当前加载进度float val = sceneAsync.progress;GameRoot.Instance.loadingWnd.SetProgress(val);if (val == 1){#region Loaded回调判断if (loaded != null)loaded();#endregion#region 单例调用打开登录窗口//LoginSys.Instance.OpenLoginWnd();#endregion//当进度满后 进度值 置空prgCB = null;sceneAsync = null;GameRoot.Instance.loadingWnd.gameObject.SetActive(false);}};#endregion}#region 【委托】更新回调 进度值void Update(){if(prgCB != null)prgCB();}#endregion#region 音乐播放资源_字典Dictionary<string,AudioClip> adDic = new Dictionary<string,AudioClip>();public AudioClip LoadAudio(string path, bool cache = false) {AudioClip au = null;//检查路径是否存在 需要对资源进行加载//out的作用是 如果路径已经存在这个资源 那么out直接就返回了if (!adDic.TryGetValue(path, out au)) {au = Resources.Load<AudioClip>(path);//检查是否需要缓存 避免重复加载if (cache) {adDic.Add(path, au);}}return au;}#endregion
}

音乐播放服务层AudioSvc.cs

using UnityEngine;
//功能 : 音乐播放服务
public class AudioSvc : MonoBehaviour{public static AudioSvc Instance;//背景音乐播放对象public AudioSource bgAudio;//窗口音乐播放对象public AudioSource uiAudio;public void InitSvc(){Instance = this;Debug.Log("Init AudioSvc...");}//播放背景音乐public void PlayBGMusic(string name, bool isLoop) {//路径 与 缓存AudioClip audio = ResSvc.Instance.LoadAudio("ResAudio/" + name,true);//检查背景音乐没有了 或 背景音乐名字不是目标名字 (代表切换音乐)if (bgAudio.clip == null || bgAudio.clip.name != audio.name) {bgAudio.clip = audio;bgAudio.loop = isLoop;bgAudio.Play();}}//播放窗口操作音效public void PlayUIAudio(string name) {//路径 与 缓存AudioClip audio = ResSvc.Instance.LoadAudio("ResAudio/" + name, true);uiAudio.clip = audio;uiAudio.Play();}
}

这样我们就可以在 业务系统中调用了

我们需要定义一个常量

添加常量

using UnityEngine;
//功能 : 登陆注册业务系统
public class LoginSys : MonoBehaviour{#region 单例模式public static LoginSys Instance = null;#endregion#region 引用登录窗口public LoginWnd loginWnd;#endregionpublic void InitSys() {#region 单例模式Instance = this;#endregionDebug.Log("Init LoginSys...");}//进入登录界面public void EnterLogin() {//TODO//异步加载登录界面//并显示加载进度#region 调用ResSvc单例类ResSvc.Instance.AsyncLoadScene(Constans.SceneLogin,() => {#region 窗口基类的好处loginWnd.SetWndState();#endregion#region 调用音乐播放服务AudioSvc.Instance.PlayBGMusic(Constans.BGLogin,true);#endregion});#endregion}
}

运行项目

这样在运行时就可以听见背景音乐了

End.

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com