EnergyEfficiencyManagement/Assets/SKFramework/Core/FileLoader/LocalAudioLoader.cs

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;
}
}
}