using UnityEngine; using System.Collections; using System.Collections.Generic; using System.IO; using System.Linq; using UnityEngine.UI; using System; using GameKitController.Audio; public class radioSystem : MonoBehaviour { [Header ("Main Settings")] [Space] public float radioVolume; public bool playSongsOnStart; public bool playSongsOnActive; public bool playSongsRandomly; public bool repeatList; public string mainManagerName = "Songs Manager"; [Space] [Header ("Debug")] [Space] public bool playingSong; public bool songPaused; public float currentSongLength; public bool radioActive; public bool movingSongLenghtSlider; public List clips = new List (); public List audioElements = new List (); public int currentIndex = 0; [Space] [Header ("Components")] [Space] public Scrollbar volumeScrollbar; public Text currentSongNameText; public Slider songLenghtSlider; public GameObject playButton; public GameObject pauseButton; public GameObject songListContent; public GameObject songListElementParent; public GameObject songListElement; public AudioSource source; public songsManager mainSongsManager; bool songsLoaded; bool radioCanBeUsed = true; public AudioElement _currentSongAudioElement = new AudioElement (); bool _currentSongAudioElementAssigned; private void InitializeAudioElements () { if (source == null) { source = gameObject.AddComponent (); } if (clips != null && clips.Count > 0) { audioElements = new List (); foreach (var clip in clips) { audioElements.Add (new AudioElement { clip = clip }); } } foreach (var audioElement in audioElements) { if (source != null) { audioElement.audioSource = source; } } if (source != null) { _currentSongAudioElement.audioSource = source; _currentSongAudioElementAssigned = _currentSongAudioElement.audioSource != null; } } void Start () { songListElement.SetActive (false); InitializeAudioElements (); volumeScrollbar.value = radioVolume; bool mainSongsManagerLocated = mainSongsManager != null; if (!mainSongsManagerLocated) { mainSongsManager = songsManager.Instance; mainSongsManagerLocated = mainSongsManager != null; } if (!mainSongsManagerLocated) { GKC_Utils.instantiateMainManagerOnSceneWithTypeOnApplicationPlaying (songsManager.getMainManagerName (), typeof(songsManager), true); mainSongsManager = songsManager.Instance; mainSongsManagerLocated = mainSongsManager != null; } if (!mainSongsManagerLocated) { mainSongsManager = FindObjectOfType (); mainSongsManagerLocated = mainSongsManager != null; } if (!mainSongsManagerLocated) { radioCanBeUsed = false; } currentSongNameText.text = "..."; } void Update () { if (!radioCanBeUsed) { return; } if (radioActive) { if (playingSong) { if (!movingSongLenghtSlider) { songLenghtSlider.value = _currentSongAudioElement.audioSource.time / currentSongLength; } if (!songPaused) { if ((_currentSongAudioElement.audioSource.time / currentSongLength) > 0.99f) { if (currentIndex == audioElements.Count - 1) { if (repeatList) { setNextSong (); } else { stopCurrentSong (); currentIndex = 0; setPlayPauseButtonState (true); } } else { if (playSongsRandomly) { setRandomSong (); } else { setNextSong (); } } } } } if (!songsLoaded) { if (mainSongsManager.allSongsLoaded ()) { getSongsList (); songsLoaded = true; } } } if (playSongsOnStart) { if (songsLoaded) { setRadioActiveState (true); playSongsOnStart = false; } } } public void playCurrentSong () { if (playingSong) { if (_currentSongAudioElementAssigned) { AudioPlayer.Play (_currentSongAudioElement, gameObject); currentSongLength = _currentSongAudioElement.clip.length; songLenghtSlider.value = _currentSongAudioElement.audioSource.time / currentSongLength; } } else { PlayCurrent (); } songPaused = false; } public void stopCurrentSong () { if (_currentSongAudioElementAssigned) { AudioPlayer.Stop (_currentSongAudioElement, gameObject); } playingSong = false; songLenghtSlider.value = 0; } public void pauseCurrentSong () { songPaused = true; if (_currentSongAudioElementAssigned) { AudioPlayer.Pause (_currentSongAudioElement, gameObject); } } public void setNextSong () { if (audioElements.Count == 0) { return; } if (playSongsRandomly) { setRandomSongIndex (); } else { currentIndex = (currentIndex + 1) % audioElements.Count; } setPlayPauseButtonState (false); PlayCurrent (); } public void setPreviousSong () { if (audioElements.Count == 0) { return; } if (playSongsRandomly) { setRandomSongIndex (); } else { currentIndex--; if (currentIndex < 0) { currentIndex = audioElements.Count - 1; } } setPlayPauseButtonState (false); PlayCurrent (); } public void setRandomSong () { setRandomSongIndex (); PlayCurrent (); } public void setRandomSongIndex () { int nextIndex = 0; int loop = 0; while (nextIndex == currentIndex) { nextIndex = (int)UnityEngine.Random.Range (0, audioElements.Count); loop++; if (loop > 100) { print ("loop error"); return; } } currentIndex = nextIndex; } public void setRadioVolume () { radioVolume = volumeScrollbar.value; if (_currentSongAudioElementAssigned) { _currentSongAudioElement.audioSource.volume = radioVolume; } } void PlayCurrent () { if (audioElements.Count <= 0) { return; } if (_currentSongAudioElementAssigned) { _currentSongAudioElement = audioElements [currentIndex]; _currentSongAudioElement.audioSource = source; _currentSongAudioElement.audioSource.time = 0; AudioPlayer.Play (_currentSongAudioElement, gameObject); string songName = audioElements [currentIndex].clip.name; int extensionIndex = songName.IndexOf ("."); if (extensionIndex > -1) { songName = songName.Substring (0, extensionIndex); } currentSongNameText.text = songName; playingSong = true; currentSongLength = _currentSongAudioElement.clip.length; songLenghtSlider.value = _currentSongAudioElement.audioSource.time / currentSongLength; } } public void setPlaySongsRandomlyState (bool state) { playSongsRandomly = state; } public void setRepeatListState (bool state) { repeatList = state; } public void setMovingSongLenghtSliderState (bool state) { if (playingSong) { movingSongLenghtSlider = state; } } public void setSongPart () { if (playingSong) { if (_currentSongAudioElementAssigned) { _currentSongAudioElement.audioSource.time = _currentSongAudioElement.clip.length * songLenghtSlider.value; } } } public void setRadioActiveState (bool state) { radioActive = state; if (radioActive) { if (playSongsOnActive) { if (playSongsRandomly) { setRandomSongIndex (); } PlayCurrent (); setPlayPauseButtonState (false); } } else { if (playingSong) { stopCurrentSong (); setPlayPauseButtonState (true); } songListContent.SetActive (false); } } public void setOnlyRadioActiveState (bool state) { radioActive = state; } public void setPlayPauseButtonState (bool state) { playButton.SetActive (state); pauseButton.SetActive (!state); } public void selectSongOnList (GameObject songButtonPressed) { string songNameToCheck = songButtonPressed.GetComponentInChildren ().text; for (int i = 0; i < audioElements.Count; i++) { if (audioElements [i].clip.name.Contains (songNameToCheck)) { currentIndex = i; PlayCurrent (); return; } } } public void getSongsList () { //print (mainSongsManager.getSongsList ().Count); audioElements = mainSongsManager.getSongsList (); for (int i = 0; i < audioElements.Count; i++) { string songName = audioElements [i].clip.name; int extensionIndex = songName.IndexOf ("."); if (extensionIndex > -1) { songName = songName.Substring (0, extensionIndex); } GameObject newSongListElement = (GameObject)Instantiate (songListElement, Vector3.zero, songListElement.transform.rotation); newSongListElement.SetActive (true); newSongListElement.transform.SetParent (songListElementParent.transform); newSongListElement.transform.localScale = Vector3.one; newSongListElement.transform.localPosition = Vector3.zero; newSongListElement.name = "Song List Element (" + songName + ")"; newSongListElement.GetComponentInChildren ().text = songName; } } }