2013-04-11 16 views
8

Próbuję stworzyć narzędzie dla projektanta dźwięku mojej grupy, które pozwoli mu usłyszeć jego plik dźwiękowy odtwarzany w Unity.Jak odtwarzać dźwięki załadowane w locie

  • Sprawdź, czy jest obciążana
  • Sprawdź, czy głośność jest odpowiednia
  • Sprawdź czy pętle prawidłowo

i tak dalej ...

Mój problem polega na znalezieniu jak jedność może zarządzać ładowaniem plików audio r. gdzieś w folderze.

Znalazłem wiele tematów mówiących o tym, ale nie ma prawdziwych rozwiązań, w jaki sposób można dynamicznie wczytywać pliki zewnętrzne Unity.

Odpowiedz

7

Jeśli chcesz załadować pliki z tym samym katalogu co plik .exe/.app można użyć to:

  • Korzystanie z System.IO DirectoryInfo(), aby wszystkie nazwy plików
  • Korzystanie z klasy WWW strumień/załadować pliki znalezione

Oto kod:

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

public class SoundPlayer : MonoBehaviour { 

    string absolutePath = "./"; // relative path to where the app is running 

    AudioSource src; 
    List<AudioClip> clips = new List<AudioClip>(); 
    int soundIndex = 0; 

    //compatible file extensions 
    string[] fileTypes = {"ogg","wav"}; 

    FileInfo[] files; 

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

    void reloadSounds() { 
     DirectoryInfo info = new DirectoryInfo(absolutePath); 
     files = info.GetFiles(); 

     //check if the file is valid and load it 
     foreach(FileInfo f in files) { 
      if(validFileType(f.FullName)) { 
       //Debug.Log("Start loading "+f.FullName); 
       StartCoroutine(loadFile(f.FullName)); 
      } 
     } 
    } 

    bool validFileType(string filename) { 
     foreach(string ext in fileTypes) { 
      if(filename.IndexOf(ext) > -1) return true; 
     } 
     return false; 
    } 

    IEnumerator loadFile(string path) { 
     WWW www = new WWW("file://"+path); 

     AudioClip myAudioClip = www.audioClip; 
     while (!myAudioClip.isReadyToPlay) 
     yield return www; 

     AudioClip clip = www.GetAudioClip(false); 
     string[] parts = path.Split('\\'); 
     clip.name = parts[parts.Length - 1]; 
     clips.Add(clip); 
    } 
} 

[EDIT]

Jeśli ktoś chce poprawić na zarządzanie plikami Polecam this link

+0

Tak, jak ty „Sprawdź czy pętle prawidłowo”? Jeśli masz zamiar odpowiedzieć na własne pytanie, zrób to całkowicie. – Joetjah

+0

Myślę, że lepiej jest użyć Path.Combine (http://msdn.microsoft.com/ru-ru/library/vstudio/fyy7a5kt(v=vs.90).aspx), aby uniknąć zależności od platformy. –

+0

@Joetjah OP stwierdził, że problem polegał tylko na tym, aby dowiedzieć się, w jaki sposób Unity może zarządzać ładowaniem plików audio – StackUnder