开启辅助访问
 找回密码
 注册帐号

扫一扫,访问微社区

开发者专栏

关注:1963

当前位置:游戏蛮牛 技术专区 开发者专栏

__________________________________________________________________________________
开发者干货区版块规则:

  1、文章必须是图文形式。(至少2幅图)
      2、文章字数必须保持在1500字节以上。(编辑器右下角有字数检查)
      3、本版块只支持在游戏蛮牛原创首发,不支持转载。
      4、本版块回复不得无意义,如:顶、呵呵、不错......【真的会扣分的哦】
      5、......
__________________________________________________________________________________
查看: 2310|回复: 6

[碧俐千仞] Unity3D热更新LuaFramework入门实战(8)——声音管理器

[复制链接]  [移动端链接]
排名
17647
昨日变化
10

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

发表于 2016-10-14 21:44:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?注册帐号

x

LuaFramework内置的管理器包括GameManager(处理热更新)、luaManager(lua脚本管理器)、PanelManager(界面管理器)、NetworkManager(网络管理器)、ResourceManager(资源管理器)、TimerManager(时间管理器)、线程管理器(ThreadManager)和SoundManager(声音管理器)。其中GameManager、luaManager、PanelManager、NetworkManager、ResourceManager在前面的文章中已经有过介绍,这一篇讲讲讲播放声音相关的SoundManager。

知乎 @罗培羽
微博 @罗培羽

1、使用方法

SoundManager估计是从其他地方拷过来的,并不能很好的与框架结合,这里我们先看看原来的SoundManager的使用方法,再介绍它的不足之处及改进方法。虽然SoundManager定义了好几个方法,但能直接在lua中使用的只有用于播放背景音乐的PlayBacksound。
编写播放声音的代码前,需要在GameManager上挂载AudioSource组件,以播放背景音乐。
Unity3D热更新LuaFramework入门实战8548.png
把声音文件放到Resource目录下,由于SoundManager使用Resources.Load加载声音文件,声音文件必须放到这个目录下。如下图所示。
Unity3D热更新LuaFramework入门实战8627.png

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

[C#] 纯文本查看 复制代码
--主入口函数。从这里开始lua逻辑
function Main()					
	LuaHelper = LuaFramework.LuaHelper;
	soundMgr = LuaHelper.GetSoundManager();
	soundMgr:PlayBacksound("motor", true)
end


运行游戏,即可听到音效。关于播放声音的内容,大家也可以参考《Unity3D网络游戏实战》哦!

2、代码解析
SoundManager的示意代码如下,实际上是使用Resources.Load来加载资源的,所以声音文件必须放在Resources目录下。
Unity3D热更新LuaFramework入门实战81016.png


这种用法违背了热更新框架的设计,因为在Resources目录下的文件并不能热更。

3、改进的声音管理器


这一部分我们需要改进声音管理器,实现这么几个功能:
1)从本地“数据目录”读取打包后的声音文件,使它支持热更新;
2)添加播放/停止背景音乐的PlayBackSound/StopBackSound和播放音效的PlaySound方法;
3)使用缓存存储加载后的声音文件,以提高运行效率。

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

[C#] 纯文本查看 复制代码
		//载入音效资源
		public void LoadAudioClip(string abName, string assetName, Action<UObject[]> func) {
			LoadAsset<AudioClip>(abName, new string[] { assetName }, func);
		}


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

[C#] 纯文本查看 复制代码
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 " + abName + "." + assetName);
						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秒播放一次音效的功能。

[C#] 纯文本查看 复制代码
--主入口函数。从这里开始lua逻辑
function Main()					
	LuaHelper = LuaFramework.LuaHelper;
	soundMgr = LuaHelper.GetSoundManager();
	soundMgr:PlayBackSound("sound", "motor")
	UpdateBeat:Add(Update, self)
end


local lastTime = 0

function Update()
	if Time.time > 3 then
		soundMgr:StopBackSound();
	end
	
	
	if Time.time - lastTime > 0.3 then
		soundMgr:PlaySound("sound", "shoot")
		lastTime = Time.time
	end
end


读者还可以使用类似 LoadAudioClip的方法加载其他资源,笔者也是刚刚接触LuaFramework不久,文章错误之处在所难免,请大家多加包涵。

最后是广告时间:

《16年的长度 记录中国独立游戏》从十多年前程序员写的小玩儿,到如今使用游戏引擎开发的炫酷产品,独立游戏作者的故事见证了我国游戏业的发展历程。来看看国产单机的造梦者们,在这十几年中做出怎么的作品,现在又过得如何。
http://games.sina.com.cn/zl/duanpian/2015-04-03/1538151.shtml

《仙剑5前传之心愿》是笔者两年前发起的一款仙剑同人游戏,使用Unity3D制作,是市面上第一款能够完成的3D仙剑同人游戏。如今我们各自踏上游戏开发一途,似乎要做点什么以致敬国产经典之作,在追求商业成就的同时,勿忘初心。可以在www.pal5h.com下载该游戏。《仙剑5前传之心愿》截图如下。
Unity3D热更新LuaFramework入门实战84427.png


评分

参与人数 2蛮牛币 +10 鲜花 +5 收起 理由
崇慕 + 10 赞一个!
L丶 + 5 神马都是浮云

查看全部评分


回复

使用道具 举报

6蛮牛粉丝
1127/1500
排名
1517
昨日变化
3

0

主题

104

帖子

1127

积分

Rank: 6Rank: 6Rank: 6

UID
56303
好友
0
蛮牛币
2704
威望
0
注册时间
2014-11-19
在线时间
349 小时
最后登录
2017-8-30
发表于 2016-10-17 11:25:11 | 显示全部楼层
《仙剑5前传之心愿》 这个项目的更新是用什么解决方案的?

回复 支持 反对

使用道具 举报

7日久生情
1737/5000
排名
1722
昨日变化
9

8

主题

283

帖子

1737

积分

Rank: 7Rank: 7Rank: 7Rank: 7

UID
159103
好友
6
蛮牛币
4715
威望
0
注册时间
2016-8-29
在线时间
776 小时
最后登录
2017-11-17

活力之星迈向小康

发表于 2016-10-17 16:54:47 | 显示全部楼层
目前还没有接触这方面知识      先学习一下

回复 支持 反对

使用道具 举报

5熟悉之中
576/1000
排名
4544
昨日变化
1

0

主题

111

帖子

576

积分

Rank: 5Rank: 5

UID
98183
好友
2
蛮牛币
539
威望
0
注册时间
2015-5-7
在线时间
218 小时
最后登录
2016-12-15
QQ
发表于 2016-12-5 15:24:21 | 显示全部楼层
看了好几章了,楼主写的的确不错

回复 支持 反对

使用道具 举报

排名
17647
昨日变化
10

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-12-6 22:35:23 | 显示全部楼层
foxsyr 发表于 2016-10-17 11:25
《仙剑5前传之心愿》 这个项目的更新是用什么解决方案的?

《心愿》没有实现热更新功能~

回复 支持 反对

使用道具 举报

排名
17647
昨日变化
10

28

主题

183

帖子

722

积分

Rank: 9Rank: 9Rank: 9

UID
53741
好友
31
蛮牛币
1980
威望
0
注册时间
2014-11-6
在线时间
117 小时
最后登录
2017-11-11

专栏作家

 楼主| 发表于 2016-12-6 22:35:54 | 显示全部楼层
永远的大野猪 发表于 2016-12-5 15:24
看了好几章了,楼主写的的确不错

好开心~~
写得不好的地方欢迎指正哈

回复 支持 反对

使用道具 举报

2初来乍到
143/150
排名
12443
昨日变化
9

1

主题

30

帖子

143

积分

Rank: 2Rank: 2

UID
192923
好友
0
蛮牛币
7
威望
0
注册时间
2016-12-16
在线时间
61 小时
最后登录
2017-11-1
发表于 2017-6-23 21:53:45 | 显示全部楼层
声音文件要放在那个文件夹里、、、、

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册帐号

本版积分规则

快速回复 返回顶部 返回列表