我是Java和Android的新手,我正在尝试使用Eclipse为Unity制作Android插件。
目标是让插件播放音频文件,有效地绕过Unity Engine的音频播放,因为统一项目的移动版本会在调用音频播放时引入滞后。
我已经看到它在youtube上实现:https://www.youtube.com/watch?v=NyceOWbr7T4
我认为你可以从Unity向插件发送一个抽象文件,问题是,如何将文件解释为soundpool对象(或资源?)以便可以播放?
*音频文件将在Unity项目中,但在jar文件之外。
答案 0 :(得分:1)
您可以做的是将音频文件粘贴到项目的streaming assets文件夹中,然后使用Media Player类来访问和播放文件。
然而,我要指出两件事。 一个。通常,使用MediaPlayer将要求您在UI线程上运行。这意味着游戏将暂停。您需要查看是否存在解决方法
湾Unity的音频解决方案不是最好的,授予。但是有很多可用的插件在资产商店中非常惊人。
答案 1 :(得分:1)
所以,我仍然无法转发实际文件(wav),然后尝试将其转换为SoundPool。我所做的是与众不同的事情:
我将音频文件放入StreamingAssets文件夹,以便在项目打包时,我仍然可以访问这些原始文件(尽管在Android中,它们被压缩成jar文件)。 (就像Axiom Studios的Venkat说的那样,我希望我能早点看到这个答案,花一些时间去发现StreamingAssets是什么。)
使用WWW,我能够从jar文件中检索原始文件。这来自“Application.streamingAssetsPath”。
使用这些文件,我将它们写入一个新目录,插件可以使用File.WriteAllBytes轻松访问。我使用了“Application.persistentDataPath”目录。
在插件方面,SoundPool能够从提供的URL获取资源,该URL是目标目录+文件名。
通过这个过程,我能够最终实现我的目标,并且性能的提升非常激烈。而且我很高兴。
*注意:但是,这会将包中的文件复制到安装文件夹(例如/data/data/com.example.app/files)。如果文件已存在,我确定您可以选择在写入之前提供检查,以便将文件留在那里以备将来使用,或者只在应用程序关闭时将其删除。
答案 2 :(得分:0)
我刚刚创建了Native Audio资产商店插件,可以从一个中央界面本地调用iOS和Android最快的本地方式。 https://www.assetstore.unity3d.com/#!/content/107067(它使用AudioTrack
而不是SoundPool
,因为从我的测试开始它更快了)
两个平台都通过Unity的StreamingAssets
特殊文件夹接收音频文件。在Java方面,这里是你如何引用文件。
在Unity中: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
来实例化它。