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

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

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

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

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

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

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

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

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

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

扫描二维码关注公众号,回复: 6571577 查看本文章

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

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

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

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

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

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

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

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

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

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<Audio> audios = new List<Audio>();
    public static AudioMgr ins;

	void Awake()
	{
		if(ins==null)
		{
            ins = this;
            DontDestroyOnLoad(this);
            AndroidNativeAudio.makePool();
        }
		else
		{
			Destroy(this);
		}
	}

    /// <summary>
    /// 播放音效
    /// </summary>
    /// <param name="clipName"></param>
    /// <param name="obj"></param>
    /// <param name="loop"></param>
    /// <returns></returns>
	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的组建上,把要播放的音效名次写上,必须要写音频文件的格式。

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

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

猜你喜欢

转载自blog.csdn.net/qq_21977253/article/details/89838349