我对Java和Android相当陌生,我正在尝试使用Eclipse为开发一个Android插件。
其目标是让插件播放音频文件,有效地绕过Unity的音频回放,因为移动构建的统一项目引入了调用音频回放的滞后。
我在youtube上看到了它的实现:https://www.youtube.com/watch?v=NyceOWbr7T4
我认为您可以将一个抽象文件从Unity发送到插件,问题是,如何将该文件解释为一个声音池对象(或资源)?这样它才能被播放?
*音频文件将在联合项目中,但在jar文件之外。
发布于 2015-02-18 02:19:02
因此,我仍然无法转发实际文件(wav),然后尝试将其转换为SoundPool。我所做的是不一样的:
通过这个过程,我最终能够完成我所要做的事情,而且性能的改善是巨大的。我对此很满意。
*注意:但是,这会将包内的文件复制到安装文件夹(例如/data/data/com.example.app/ files )。我相信您可以选择在编写文件之前提供检查,如果文件已经存在,那么您就可以将文件留在那里供将来使用,或者在应用程序关闭时删除它们。
发布于 2015-02-16 17:39:22
您可以做的是将音频文件插入项目的流资产文件夹,然后使用媒体播放器类访问和播放该文件。
不过,我要指出两点。通常,使用MediaPlayer将要求您在UI线程上运行。这意味着游戏将暂停。你得看看有没有办法
统一的音频解决方案并不是最好的,当然。但是在资产商店里有很多可用的插件是相当惊人的。
发布于 2018-04-14 04:41:58
我刚刚制作了本地音频资产存储插件,它可以从一个中央界面对iOS和Android最快的原生方式进行本地调用。https://www.assetstore.unity3d.com/#!/content/107067 (不过它使用的是AudioTrack而不是SoundPool,因为从我的测试来看,它更快)
两个平台都通过统一的StreamingAssets特殊文件夹接收音频文件。在Java端,下面是如何引用该文件的方法。
在统一中:Assets/StreamingAssets/Assist.wav
在Java中:
Context context = UnityPlayer.currentActivity;
AssetManager assetManager = context.getAssets();
try {
AssetFileDescriptor descriptor = assetManager.openFd(audioPath);
byte[] music = new byte[(int) descriptor.getLength()];
InputStream is = assetManager.open(audioPath);
is.read(music);
is.close();
//Do whatever you want with "music"
} catch (IOException e) {
Log("Error reading audio file " + audioPath);
e.printStackTrace();
return -1;
}现在您有了一个音频的byte[]数组。audioPath这里应该是"Assist.wav“。我想您可以把它放到SoundPool中来实例化它。
https://stackoverflow.com/questions/28532952
复制相似问题