6.Unity3D热更新-LuaFramework-声音管理器

来源:互联网 发布:摇一摇截图软件大全 编辑:程序博客网 时间:2024/04/30 03:21

本文固定链接:http://blog.csdn.net/u013108312/article/details/53945121


1、使用方法

SoundManager估计是从其他地方拷过来的,并不能很好的与框架结合,这里我们先看看原来的SoundManager的使用方法,再介绍它的不足之处及改进方法。虽然SoundManager定义了好几个方法,但能直接在lua中使用的只有用于播放背景音乐的PlayBacksound。

把声音文件放到Resource目录下,由于SoundManager使用Resources.Load加载声音文件,声音文件必须放到这个目录下。

然后编写lua代码,调用soundMgr:PlayBacksound即可,它的第一个参数指明Resource目录下的文件名,第二个参数为true表示开始播放,false表示停止播放。

--主入口函数。从这里开始lua逻辑function Main()                     LuaHelper = LuaFramework.LuaHelper;    soundMgr = LuaHelper.GetSoundManager();    soundMgr:PlayBacksound("testsound", true)end

运行游戏,即可听到音效。

2、改进的声音管理器
这一部分我们需要改进声音管理器,实现这么几个功能:

1)从本地“数据目录”读取打包后的声音文件,使它支持热更新;

2)添加播放/停止背景音乐的PlayBackSound/StopBackSound和播放音效的PlaySound方法;

3)使用缓存存储加载后的声音文件,以提高运行效率。

为了支持加载AudioClip的加载,在ResourceManager中添加LoadAudioClip方法,该方法将会加载资源包abName的资源assetName,加载完AudioClip资源后调用回调函数func,代码如下。

//载入音效资源public void LoadAudioClip(string abName,                                   string assetName, Action<UObject[]> func) {    LoadAsset<AudioClip>(abName, new string[] { assetName }, func);}

修改SoundManager,使用Hashtable类型的sounds存储加载后的声音,包含PlayBackSound、StopBackSound和PlaySound三个API。代码如下所示。

using UnityEngine;using System.Collections;using System.Collections.Generic;namespace LuaFramework {    public class SoundManager : Manager {        private AudioSource audio;        private Hashtable sounds = new Hashtable();        string backSoundKey = "";        void Start() {            audio = GetComponent<AudioSource>();            if (audio == null)            {                gameObject.AddComponent<AudioSource>();            }        }        //回调函数原型        private delegate void GetBack(AudioClip clip, string key);        //获取声音资源        private void Get(string abName,string assetName,GetBack cb)        {            string key = abName + "." + assetName;            if (sounds[key] == null)            {                ResManager.LoadAudioClip(abName, assetName, (objs) =>                {                    if (objs == null || objs[0] == null)                    {                        Debug.Log("PlayBackSound fail");                        cb(null, key);                        return;                    }                    else                    {                        sounds.Add(key, objs[0]);                        cb(objs[0] as AudioClip, key);                        return;                    }                });            }            else            {                cb(sounds[key] as AudioClip, key);                return;            }        }        //播放背景音乐        public void PlayBackSound(string abName, string assetName)        {            backSoundKey = abName + "." + assetName;            Get(abName, assetName, (clip, key) =>            {                if (clip == null)                    return;                if (key != backSoundKey)                    return;                audio.loop = true;                audio.clip = clip;                audio.Play();            });        }        //停止播放音乐        public void StopBackSound()        {            backSoundKey = "";            audio.Stop();        }        //播放音效        public void PlaySound(string abName, string assetName)        {            Get(abName, assetName, (clip, key) =>            {                if (clip == null)                    return;                if (Camera.main == null)                    return;                AudioSource.PlayClipAtPoint(clip,                            Camera.main.transform.position);            });        }        }}

修改代码后,需要重新生成wrap文件(点击菜单栏的Lua→Clear wrap files和Lua→Generate All)。然后编写lua代码调试它吧!这里演示的是先播放背景音乐,3秒后停止播放,每隔0.3秒播放一次音效的功能。

--主入口函数。从这里开始lua逻辑function Main()                     LuaHelper = LuaFramework.LuaHelper;    soundMgr = LuaHelper.GetSoundManager();    soundMgr:PlayBackSound("sound", "testsoundbg")    UpdateBeat:Add(Update, self)endlocal lastTime = 0function Update()    if Time.time > 3 then        soundMgr:StopBackSound();    end    if Time.time - lastTime > 0.3 then        soundMgr:PlaySound("sound", "testsoundshoot")        lastTime = Time.time    endend

本文固定链接:http://blog.csdn.net/u013108312/article/details/53945121


1 0
原创粉丝点击