Add a Play Next Song And A shuffle Option To Music Player C#

I have this music player script that I would really like to be able to add a couple more options too:

  1. a button for shuffle songs.
  2. Play next song automatically. this is an awesome music player only it’s currently lacking the ability to play the next song in the array.

here is the music player Script. With help from some other postings it now currently has the ability to display using UI text the current song playing. So it’s getting there. :slight_smile:

using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using UnityEngine.UI;

public class AltMusicPlayer : MonoBehaviour
{

	public Text MusicListText;// Reference to my UI Display Text for Songs
	private string display = "";//NEW Delete if does not work!!
	public enum SeekDirection { Forward, Backward }
	
	public AudioSource source;
	public List<AudioClip> clips = new List<AudioClip>();
	
	[SerializeField] [HideInInspector] private int currentIndex = 0;
	
	private FileInfo[] soundFiles;
	private List<string> validExtensions = new List<string> { ".ogg", ".wav" }; // Don't forget the "." i.e. "ogg" won't work - cause Path.GetExtension(filePath) will return .ext, not just ext.
	private string absolutePath = "./Audio/Music"; // relative path to where the app is running - change this to "./music" in your case

	void Start()
	{
		//being able to test in unity
		if (Application.isEditor) absolutePath = "Assets/Audio/Music";
		
		if (source == null) source = gameObject.AddComponent<AudioSource>();
		ReloadSounds();
	}

	//My New UI Buttons Added
	public void PlayPrevious (){
		Seek(SeekDirection.Backward);
		PlayCurrent();
	}

	public void PlayCurrentClip () {
		PlayCurrent();
	}

	public void PlayNext () {
		Seek(SeekDirection.Forward);
		PlayCurrent();
	}

	public void ReloadAudio () {
		ReloadSounds();
	}


	//End My New UI Buttons Added
	
	void Seek(SeekDirection d)
	{
		if (d == SeekDirection.Forward)
			currentIndex = (currentIndex + 1) % clips.Count;
		else {
			currentIndex--;
			if (currentIndex < 0) currentIndex = clips.Count - 1;
		}
	}
	
	void PlayCurrent()
	{
		source.clip = clips[currentIndex];
		source.Play();
		Debug.Log (source.clip);
		MusicListText.text = clips[currentIndex].name;
	}
	
	void ReloadSounds()
	{
		clips.Clear();
		
		// get all valid files
		var info = new DirectoryInfo(absolutePath);
		soundFiles = info.GetFiles()
			.Where(f => IsValidFileType(f.Name))
				.ToArray();
		
		// and load them
		foreach (var s in soundFiles)
			StartCoroutine(LoadFile(s.FullName));
	}
	
	bool IsValidFileType(string fileName)
	{
		return validExtensions.Contains(Path.GetExtension(fileName));
		// Alternatively, you could go fileName.SubString(fileName.LastIndexOf('.') + 1); that way you don't need the '.' when you add your extensions
	}
	
	IEnumerator LoadFile(string path)
	{
		WWW www = new WWW("file://" + path);
		print("loading " + path);
		
		AudioClip clip = www.GetAudioClip(false);
		while(!clip.isReadyToPlay)
			yield return www;
		
		print("done loading");
		clip.name = Path.GetFileName(path);
		clips.Add(clip);


		//Count Array List Length
		//source.clip = clips[currentIndex];
		Debug.Log (clip);
		//int List = clips.Count;
		//Debug.Log (List);
	}

	//NEW
	void AddText()
	{
		display = currentIndex + " : " + clips[currentIndex].name;
		MusicListText.text = display;
	}
	//END NEW

	//Quit Button
	public void  GoQuit(){
		StartCoroutine(LoadQuit("ThreeD_Overview"));
	}
	
	IEnumerator LoadQuit(string levelMain){
		yield return new WaitForSeconds(0.5f); // wait time
		Application.LoadLevel(levelMain);
		
	}


}

Ok, 2 things:

First, there isn’t a question there.
Second, I had typed up an answer for the questions I think you had (‘how do I shuffle’ and ‘how do I automatically go to the next clip’), but it struck me that it was literally 4 lines of code that you should really be able to figure out yourself if you think about your problem for more than 30 seconds.

Still, in case you really are stuck (somehow), I’ll give you some hints:

For automatically playing the next item, you already have a PlayNext() method. So all you need to do is figure out when your current clip is done playing. Read the AudioSource docs.

For shuffle. Get a random value for your currentIndex then play the clip at that index.

You really should be able to figure it out with that - I’ve basically given the complete answers anyway even though I only wanted to hint at them.

Oh, and third, what is the point of the PlayCurrentClip() method?