118 lines
3.4 KiB
C#
118 lines
3.4 KiB
C#
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using UnityEngine;
|
|
using UnityEngine.Networking;
|
|
|
|
public static class LocalAudioLoader
|
|
{
|
|
/// <summary>
|
|
/// 加载文件夹下所有音频文件
|
|
/// </summary>
|
|
/// <param name="folderPath">音频文件夹完整路径</param>
|
|
/// <param name="onComplete">加载完成回调</param>
|
|
public static IEnumerator LoadAudios(
|
|
string folderPath,
|
|
System.Action<List<AudioClip>> onComplete)
|
|
{
|
|
List<AudioClip> clips = new List<AudioClip>();
|
|
|
|
if (!Directory.Exists(folderPath))
|
|
{
|
|
Debug.LogError($"[LocalAudioLoader] 文件夹不存在: {folderPath}");
|
|
onComplete?.Invoke(clips);
|
|
yield break;
|
|
}
|
|
|
|
string[] files = Directory.GetFiles(folderPath);
|
|
|
|
foreach (string file in files)
|
|
{
|
|
if (!IsAudioFile(file))
|
|
continue;
|
|
|
|
string url = "file://" + file;
|
|
|
|
using (UnityWebRequest request =
|
|
UnityWebRequestMultimedia.GetAudioClip(url, GetAudioType(file)))
|
|
{
|
|
yield return request.SendWebRequest();
|
|
|
|
if (request.result != UnityWebRequest.Result.Success)
|
|
{
|
|
Debug.LogError($"音频加载失败: {file}\n{request.error}");
|
|
continue;
|
|
}
|
|
|
|
AudioClip clip = DownloadHandlerAudioClip.GetContent(request);
|
|
clip.name = Path.GetFileNameWithoutExtension(file);
|
|
clips.Add(clip);
|
|
}
|
|
}
|
|
|
|
onComplete?.Invoke(clips);
|
|
}
|
|
|
|
/// <summary>
|
|
/// 加载单个本地音频文件
|
|
/// </summary>
|
|
/// <param name="filePath">音频完整路径</param>
|
|
/// <param name="onComplete">加载完成回调</param>
|
|
public static IEnumerator LoadAudio(
|
|
string filePath,
|
|
System.Action<AudioClip> onComplete)
|
|
{
|
|
if (!File.Exists(filePath))
|
|
{
|
|
Debug.LogError($"[LocalAudioLoader] 音频不存在: {filePath}");
|
|
onComplete?.Invoke(null);
|
|
yield break;
|
|
}
|
|
|
|
if (!IsAudioFile(filePath))
|
|
{
|
|
Debug.LogError($"[LocalAudioLoader] 非音频格式: {filePath}");
|
|
onComplete?.Invoke(null);
|
|
yield break;
|
|
}
|
|
|
|
string url = "file://" + filePath;
|
|
|
|
using (UnityWebRequest request =
|
|
UnityWebRequestMultimedia.GetAudioClip(url, GetAudioType(filePath)))
|
|
{
|
|
yield return request.SendWebRequest();
|
|
|
|
if (request.result != UnityWebRequest.Result.Success)
|
|
{
|
|
Debug.LogError($"音频加载失败: {filePath}\n{request.error}");
|
|
onComplete?.Invoke(null);
|
|
yield break;
|
|
}
|
|
|
|
AudioClip clip = DownloadHandlerAudioClip.GetContent(request);
|
|
clip.name = Path.GetFileNameWithoutExtension(filePath);
|
|
onComplete?.Invoke(clip);
|
|
}
|
|
}
|
|
|
|
private static bool IsAudioFile(string path)
|
|
{
|
|
string ext = Path.GetExtension(path).ToLower();
|
|
return ext == ".wav" || ext == ".ogg" || ext == ".mp3";
|
|
}
|
|
|
|
private static AudioType GetAudioType(string path)
|
|
{
|
|
string ext = Path.GetExtension(path).ToLower();
|
|
|
|
switch (ext)
|
|
{
|
|
case ".wav": return AudioType.WAV;
|
|
case ".ogg": return AudioType.OGGVORBIS;
|
|
case ".mp3": return AudioType.MPEG;
|
|
default: return AudioType.UNKNOWN;
|
|
}
|
|
}
|
|
}
|