You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

145 lines
3.8 KiB

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.Networking;
namespace UltraCombos
{
public class SoundLoader : MonoBehaviour
{
[SerializeField]
string folder;
[SerializeField]
List<string> filenames = new List<string>();
List<AudioClip> clips = new List<AudioClip>();
AudioSource source = null;
[SerializeField, Range(0, 1)]
float volumeScale = 1.0f;
float target_volume = 1.0f;
public UnityEvent onPlayFinished = new UnityEvent();
[Header("Debug")]
public string info;
private void Start()
{
if (filenames.Count == 0)
{
string filename = gameObject.name;
LoadFile(filename);
}
else
{
foreach (var filename in filenames)
{
LoadFile(filename);
}
}
source = gameObject.AddComponent<AudioSource>();
source.playOnAwake = false;
}
void LoadFile(string filename)
{
string path = $"{Application.dataPath}/../../{folder}/{filename}";
if (System.IO.File.Exists(path))
{
var ext = System.IO.Path.GetExtension(path);
AudioType type = AudioType.UNKNOWN;
if (ext.Equals(".AIF", System.StringComparison.CurrentCultureIgnoreCase))
{
type = AudioType.AIFF;
}
else if (ext.Equals(".WAV", System.StringComparison.CurrentCultureIgnoreCase))
{
type = AudioType.WAV;
}
if (type != AudioType.UNKNOWN)
{
StartCoroutine(LoadAudioFile($"file://{path}", type));
}
else
{
}
}
}
private void Update()
{
source.volume = Mathf.Lerp(source.volume, target_volume * volumeScale, Time.deltaTime);
if (source.isPlaying && target_volume > 0.5f && source.clip != null)
{
info = $"{source.time:F1}/{source.clip.length:F1}";
if (source.clip.length - source.time < 1.0f)
{
onPlayFinished.Invoke();
info = "play finished";
}
}
}
public void PlayOneShot()
{
if (clips.Count == 0)
return;
source.PlayOneShot(clips[Random.Range(0, clips.Count)], volumeScale);
}
public void FadeIn()
{
if (clips.Count == 0)
return;
source.clip = clips[0];
source.Play();
source.volume = 0.0f;
target_volume = 1.0f;
}
public void FadeOut()
{
if (clips.Count == 0)
return;
target_volume = 0.0f;
}
IEnumerator LoadAudioFile(string uri, AudioType type)
{
using (var www = UnityWebRequestMultimedia.GetAudioClip(uri, type))
{
yield return www.SendWebRequest();
if (www.isNetworkError || www.isHttpError)
{
Debug.Log(www.error);
}
else
{
using (var hanlder = www.downloadHandler as DownloadHandlerAudioClip)
{
if (hanlder != null)
{
clips.Add(hanlder.audioClip);
}
}
}
yield return null;
}
}
}
}