Jump to content
UnitySpain
MisterioElGatoConSuerte

(Aporte) Reproductor de musica

Recommended Posts

Saludos Programadores

Tengo mucho tiempo sin pasarme por aquí y he echo un pequeño código que creo que le resultara útil para muchos que estén iniciando y e decidido compartirlo con ustedes para empezar de nuevo en esta comunidad con el pie derecho x'D

El script reproduce aleatoriamente las músicas dadas en una variable con una transición para que no cambien de golpe.

Solo necesitan agregar el script a un GameObject vacío y agregarle el tiempo que desean que use para la transición y agregar una lista de músicas a reproducir.

Editado:

using UnityEngine;
using System.Collections;
using UnityEditor;

// Ayuda: Boris 1998 registrado en Forum.unity.com
public class ReproductorMusica : MonoBehaviour{

	public AudioClip[] musicas; // Musicas a reproducir.
	public float fade = 2; // tiempo tardado en la trasicion de las musicas.
	public Vector2 lapsos = new Vector2(0,200); // lapsos de tiempo sin sonido, en segudos.
	[Range(0f,1f)]
	public float volumen = 1;// volumen deseado que se escuche la musica.
	public AudioClip backGround; // musica a reproducir durante el lapso.

	private AudioSource audio1;
	private AudioSource audio2;
	private int musicaT;

	public static ReproductorMusica reproductor;

	void Start (){
		reproductor = gameObject.GetComponent<ReproductorMusica> ();
		audio1 = gameObject.GetComponent<AudioSource> ();
		if(audio1 == null){
			gameObject.AddComponent<AudioSource> ();
			audio1 = gameObject.GetComponent<AudioSource> ();
		}
		try {
			audio2 = gameObject.transform.GetChild(0).gameObject.GetComponent<AudioSource> ();
		} catch (System.Exception ex) {
			if(gameObject.transform.childCount == 0){
				GameObject ob = new GameObject ();
				ob.name = "ReproductorSecundario";
				ob.transform.SetParent (transform);
			}
			gameObject.transform.GetChild(0).gameObject.AddComponent<AudioSource> ();
			audio2 = gameObject.transform.GetChild(0).gameObject.GetComponent<AudioSource> ();
		}
		musicaT = Random.Range (0,musicas.Length);
		StartCoroutine (Reproducir(audio1));
	}

	public static void Volumen (float vol){
		ReproductorMusica.reproductor.audio1.volume = vol;
		ReproductorMusica.reproductor.audio2.volume = vol;
	}

	public static void CambiarMusica (AudioClip musica){
		ReproductorMusica.reproductor.StopAllCoroutines ();
		ReproductorMusica.reproductor.StartCoroutine (ReproductorMusica.reproductor.RPA(musica));
	}

	IEnumerator RPA (AudioClip musica){
		AudioSource ad,ad2; 
		if (audio1.clip != null) {
			ad = audio2;
			ad2 = audio1;
		} else {
			ad = audio1;
			ad2 = audio2;
		}

		ad.clip = musica;
		ad.Play ();
		StartCoroutine (FadeStart(ad,fade,volumen));

		while (ad2.volume > 0) {
			ad2.volume -= volumen * Time.deltaTime / fade;
			yield return null;
		}
		ad2.Stop ();
		ad2.clip = null;
		ad2.volume = volumen;

		musicaT = Random.Range (0,musicas.Length);
		yield return new WaitForSeconds(ad.clip.length-fade);
		yield return StartCoroutine(FadeOut (ad, fade));
	}

	public static void Apagar (){
		ReproductorMusica.reproductor.StopAllCoroutines ();
		ReproductorMusica.reproductor.StartCoroutine (ReproductorMusica.reproductor.AP());
	}

	IEnumerator AP (){
		while (audio1.volume > 0) {
			audio1.volume -= volumen * Time.deltaTime / fade;
			audio2.volume -= volumen * Time.deltaTime / fade;
			yield return null;
		}
		audio1.Stop ();
		audio1.clip = null;
		audio1.volume = volumen;

		audio2.Stop ();
		audio2.clip = null;
		audio2.volume = volumen;
	}

	public static void Reiniciar (){
		ReproductorMusica.reproductor.StopAllCoroutines ();

		AudioSource ad,ad2; 
		if (ReproductorMusica.reproductor.audio1.clip != null) {
			ad = ReproductorMusica.reproductor.audio2;
			ad2 = ReproductorMusica.reproductor.audio1;
		} else {
			ad = ReproductorMusica.reproductor.audio1;
			ad2 = ReproductorMusica.reproductor.audio2;
		}

		ReproductorMusica.reproductor.musicaT = Random.Range (0,ReproductorMusica.reproductor.musicas.Length);
		ReproductorMusica.reproductor.StartCoroutine (ReproductorMusica.reproductor.Reproducir(ad));
		ReproductorMusica.reproductor.StartCoroutine (ReproductorMusica.reproductor.AP1(ad2));
	}

	IEnumerator AP1 (AudioSource ad){
		while (ad.volume > 0) {
			ad.volume -= volumen * Time.deltaTime / fade;
			yield return null;
		}
		ad.Stop ();
		ad.clip = null;
		ad.volume = volumen;
	}

	IEnumerator FadeStart (AudioSource audioSource, float FadeTime, float vol) {
		audioSource.volume = 0;
		while (audioSource.volume < vol) {
			audioSource.volume += vol * Time.deltaTime / FadeTime;

			yield return null;
		}
		audioSource.volume = vol;
	}

	IEnumerator Reproducir (AudioSource ad){
		ad.clip = musicas [musicaT];
		ad.Play ();
		StartCoroutine (FadeStart(ad,fade,volumen));

		musicaT = Random.Range (0,musicas.Length);
		yield return new WaitForSeconds(ad.clip.length-fade);
		yield return StartCoroutine(FadeOut (ad, fade));
	}

	IEnumerator FadeOut (AudioSource audioSource, float FadeTime) {
		AudioSource audioSource2;
		if (audioSource == audio1) {
			audioSource2 = audio2;
		} else {
			audioSource2 = audio1;
		}
		float lp = Random.Range ((int)lapsos.x, (int)lapsos.y);
		if(lp == 0){
			StartCoroutine (Reproducir (audioSource2));
		}else if(backGround != null){
			StartCoroutine (FadeStart(audioSource2,fade,volumen*0.75f));
			audioSource2.clip = backGround; 
			audioSource2.Play ();
			audioSource2.loop = true;
		}
		while (audioSource.volume > 0) {
			audioSource.volume -= volumen * Time.deltaTime / FadeTime;
			yield return null;
		}
		audioSource.Stop ();
		audioSource.clip = null;
		audioSource.volume = volumen;
		yield return new WaitForSeconds (lp);
		if(lp > 0){
			StartCoroutine (Reproducir (audioSource));
			while (audioSource2.volume > 0) {
				audioSource2.volume -= volumen * Time.deltaTime / FadeTime;
				yield return null;
			}
			audioSource2.Stop ();
			audioSource2.clip = null;
			audioSource2.loop = false;
			audioSource2.volume = volumen;
		}
	}
}

Propiedades.

fade : El tiempo que tardan las transiciones en segundos.

musicas : lista de músicas a reproducir.

Añadido :

lapsos: lapsos de tiempo aleatorio(Vector2(Minimo,Maximo)) en el que no sonara la musica.

volumen: volumen de la musica.

backGround: Sonido de fondo que sonara durante los lapsos (se puede dejar en blanco).

Funciones Estaticas:

Volumen: cambia el volumen de la musica.

CambiarMusica: cambia la musica por la musica dada con una transicion con la duracion dada en fade.

Apagar: apaga el reproductor.

Reiniciar: Reinicia el reproductor.

Aquí pueden descargar el código.

PD: no soy bueno comentando así que no comento los códigos espero entiendan el código en caso de que tengan que modificar algo :'v

Edit: le cambie el titulo por que creo que generaba confucion.

Edited by Misterio El GatoConSuerte
mejor así...

Share this post


Link to post
Share on other sites

Sencillo y claro aporte para la Comunidad que busque una cómoda API para audio. Muchas gracias! :27_sunglasses::91_thumbsup:

Share this post


Link to post
Share on other sites

×
×
  • Create New...