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

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

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

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

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

unity 播放同一声音结果不同 unity添加声音听不见_System

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

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

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

unity 播放同一声音结果不同 unity添加声音听不见_unity音频 Android_02

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

unity 播放同一声音结果不同 unity添加声音听不见_unity音频 Android_03

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

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

unity 播放同一声音结果不同 unity添加声音听不见_Android_04

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

unity 播放同一声音结果不同 unity添加声音听不见_System_05

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

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

unity 播放同一声音结果不同 unity添加声音听不见_unity音频 Android_06

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

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

unity 播放同一声音结果不同 unity添加声音听不见_System_07

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

unity 播放同一声音结果不同 unity添加声音听不见_unity 播放同一声音结果不同_08

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

unity 播放同一声音结果不同 unity添加声音听不见_System_09

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 Listaudios = new List();
public static AudioMgr ins;
void Awake()
{
if(ins==null)
{
ins = this;
DontDestroyOnLoad(this);
AndroidNativeAudio.makePool();
}
else
{
Destroy(this);
}
}
/// /// 播放音效
///
///
///
///
///
public static void Play(string clipName, Object obj, bool loop = false)
{
for (int i = 0; i < ins.audios.Count; i++)
{
if (ins.audios[i].name != clipName)
continue;
AndroidNativeAudio.play(ins.audios[i].fileID, 1, -1, 1, loop ? -1 : 0);
return;
}
AndroidNativeAudio.load(clipName, false, (fileID)=> {
ins.audios.Add(new Audio(clipName, fileID, obj));
AndroidNativeAudio.play(fileID, 1, -1, 1, loop ? -1 : 0);
});
}
void OnApplicationQuit()
{
// Clean up when done
for (int i = 0; i < ins.audios.Count; i++)
AndroidNativeAudio.unload(ins.audios[i].fileID);
AndroidNativeAudio.releasePool();
}
}

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

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

unity 播放同一声音结果不同 unity添加声音听不见_System_10

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

unity 播放同一声音结果不同 unity添加声音听不见_unity 播放同一声音结果不同_11

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