unity发布到Android的音频解决方案

本以为开发就要完成了,再添加个音效就完事了, 应该很轻松的一件事,但是事实并不是我想的那样。

刚开始的时候直接用unity的AudioSource音源组建来播放游戏的各种音效,把全部音效都加上后进行编译apk文件。然后在腾讯手游助手安装了apk,打开运行游戏,游戏运行了几分钟之后就无缘无故进入卡死状态。

本以为是代码有问题,把一些for代码在Update函数都注释掉后重新编译apk,还是不行。经过一步一步的排除后,发现把音源组建AudioSource的PlayOnAwake关掉或把Enable直接关掉后再编译apk,编译完成后在腾讯模拟器运行,这下终于没有出现卡死现象。

这下知道是音源组建就是导致Android卡死的原因了,然后尝试改改音频剪辑属性,然后编译在模拟器运行,还是会有卡死现象。把音频剪辑的各个属性都修改为不同的方式,然后编译运行。还是会卡死,根本就起不了作用, 通过网上查找各种资料,然后照着做,一遍又一遍编译运行,等待的都是编译的时间。好烦躁有木有? 

在网上查找资料的时候还有的说是音源设置那里设置下Buff选项就不会有问题了,我也照着来了一遍,真TM不行啊,看下图:

unity发布到Android的音频解决方案_第1张图片

以上的方法都试过后,感觉真没有办法了,应该要舍弃unity的AudioSource组建,用别的方法实现才行。

经过无数次的网上找资料,最后发现unity官方给出了一个Android的插件,使用了Android原生的音源播放系统来播放音效。

下图就是AndroidNativeAudio插件的下载地址:在unity商店直接搜索AndroidNativeAudio即可找到,而且是麻烦的

unity发布到Android的音频解决方案_第2张图片

把AndroidNativeAudio插件导入项目后,会有两个demo, 

unity发布到Android的音频解决方案_第3张图片

ANA文件下是wav格式的音频demo,ANAMusic文件夹下是mp3格式的demo

这个两种音频格式是被区分出来的,我刚下载下来看的时候,以为只要使用一种就可以了,(不过还真可以,这里说一下废话)

unity发布到Android的音频解决方案_第4张图片

核心类ANAMusic类为播放mp3格式或长音频用的,刚开始我只使用了这个ANAMusic类作为游戏音效处理,结果发现性能还是不稳定,60fps直接下到30fps,而且连续播放wav音频会出现无声。经过一天的时间尝试后,感觉快发疯了。这个插件没有乱用,在我快要放弃的时候,脑子突然想起不是还有一种音频播放类吗?  然后直接找那另一个播放音频类,看下图:

unity发布到Android的音频解决方案_第5张图片

就是这个类型了,然后尝试用这个类弄最后一次,如果不行的话就放弃这个插件了。果然经过测试后发现这个才是真正的播放短音频的核心类,AndroidNativeAudio类用来播放场景的各种短音效。

经过测试这个AndroidNativeAudio类的各种方法,终于可以实现我想要的功能。下图是插件的API使用演示:

unity发布到Android的音频解决方案_第6张图片

下面是我实现了一个音乐播放的代码:首先AndroidNativeAudio.load方法加载音乐文件到内存流中,然后加载完成后调用第三个委托参数,在里面就可以进行播放音效,委托函数有一个参数是文件的ID,通过文件ID得到你要播放的音效文件。

 AndroidNativeAudio.play播放之后返回的是你当前播放的音效真正的流对象ID, 通过音效流ID才能暂停播放或停止播放,继续播放等方法来播放音效。

unity发布到Android的音频解决方案_第7张图片

下图是我实现了UI按钮按下后播放音效的功能:

unity发布到Android的音频解决方案_第8张图片

下图是我的核心播放Android的音效类:

unity发布到Android的音频解决方案_第9张图片

using UnityEngine;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Threading;
using System.Collections.Concurrent;
using System.Collections;

[System.Serializable]
public struct Audio
{
    public string name;
	public int fileID;
	public Object obj;

    public Audio(string name, int musicID, Object obj)
	{
        this.name = name;
		this.fileID = musicID;
		this.obj = obj;
	}
}

///音效管理
public class AudioMgr : MonoBehaviour
{
	public List

通过上面的功能实现,最后可以在安卓手机上流畅的播放音效了。。。

然后把脚本添加到有button的组建上,把要播放的音效名次写上,必须要写音频文件的格式。

unity发布到Android的音频解决方案_第10张图片

重要提示:音效文件必须放在StreamingAssets文件夹目录下才能找到,否则无法找到音效文件

unity发布到Android的音频解决方案_第11张图片

到这里教程就结束了,希望对你有帮助

 

你可能感兴趣的:(unity发布到Android的音频解决方案)